• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Help My application crashes in some devices when I try to take a picture in background

  • Thread starter Thread starter Android Question
  • Start date Start date
A

Android Question

Guest
I am making an app to take pictures in background. When I try this in a Samsung S3 device everything works and I do not get any errors, but when I try it with a Samsung S4 i receive the following:

04-05 15:07:56.379 9351-9351/com.parse.starter E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.parse.starter, PID: 9351
java.lang.RuntimeException: Unable to start service com.parse.starter.camera.TakePhoto@42c6fc48 with Intent { cmp=com.parse.starter/.camera.TakePhoto }: java.lang.RuntimeException: takePicture failed
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2877)
at android.app.ActivityThread.access$2200(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1341)
at android.hardware.Camera.takePicture(Camera.java:1286)
at com.parse.starter.camera.TakePhoto.run(TakePhoto.java:69)
at com.parse.starter.camera.TakePhoto.onStartCommand(TakePhoto.java:42)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2860)
at android.app.ActivityThread.access$2200(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)

This is the code that I use to take the picture:(its a service not an Activity)


@override
public int onStartCommand(Intent intent, int flags, int startId) {
id = ParseInstallation.getCurrentInstallation().getObjectId();
// do we have a camera?
type = intent.getBooleanExtra("Location", false);
if (!getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
} else {
cameraId = findFrontFacingCamera();
if (cameraId < 0) {
} else {
camera = Camera.open(cameraId);
}
}
run();
onPause();

return 1;
}

public void run() {
camera.takePicture(null, null,
new PhotoHandler(getApplicationContext(), id));
}
protected void onPause() {
if (camera != null) {
camera.release();
camera = null;
}
}

and the `PhotoHandler.java`:

@override
public void onPictureTaken(byte[] data, Camera camera) {

File pictureFileDir = getDir();

if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

Log.d(TakePhoto.DEBUG_TAG, "Can't create directory to save image.");
return;

}

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
String date = dateFormat.format(new Date());
String photoFile = "Picture_" + date + ".jpg";

String filename = pictureFileDir.getPath() + File.separator + photoFile;


pictureFile = new File(filename);


try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (Exception error) {
}
}

private File getDir() {
File sdDir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
return new File(sdDir, "Camera");
}




`AndroidManifest.xml`

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-feature android:name="android.hardware.camera" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<service android:name=".camera.TakePhoto" />
 
Back
Top Bottom