Ошибка возникает внутри CameraFragment
- фрагмент, содержащий только FrameLayout (для предварительного просмотра камеры) и ImageButton (используется для захвата изображения). В моем фрагменте у меня есть PictureCallback:
private static Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
CameraFragment.DATA=data;
final int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_STORAGE
);
return;
}
saveImageToDevice();
}
};
и я получаю экземпляр своей камеры из HandlerThread:
private CameraHandlerThread mThread = null;
private static class CameraHandlerThread extends HandlerThread {
Handler mHandler = null;
private Camera handlerCamera;
CameraHandlerThread() {
super("CameraHandlerThread");
start();
mHandler = new Handler(getLooper());
}
synchronized void notifyCameraOpened() {
notify();
}
void openCamera() {
mHandler.post(new Runnable() {
@Override
public void run() {
handlerCamera = getCameraInstance();
notifyCameraOpened();
}
});
try {
wait();
}
catch (InterruptedException e) {
}
}
public Camera getCamera() {
return handlerCamera;
}
}
то я вызываю этот метод (где возникает исключение) в OnCreateView():
private void launchCamera() {
newOpenCamera();
mPreview = new CameraPreview(getContext(), mCamera, activity);
mPreview.setCameraDisplayOrientation(activity, CAMERA_ID, mCamera);
preview = (FrameLayout) view.findViewById(R.id.tvCamera);
preview.addView(mPreview);
ivCaptureImage = (ImageView) view.findViewById(R.id.ivCaptureImage);
ivCaptureImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.takePicture(null, null, mPicture);
}
});
}
где newOpenCamera:
private void newOpenCamera() {
if (mThread == null) {
mThread = new CameraHandlerThread();
}
synchronized (mThread) {
mThread.openCamera();
mCamera = mThread.getCamera();
}
}
Я запустил отладчик и вижу, что строка, в которой произошла ошибка (mCamera.takePicture(...) в launchCamera()), вызывается, но ошибка возникает перед PictureCallback. Ошибка:
E/UncaughtException: java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1523)
at android.hardware.Camera.takePicture(Camera.java:1468)
at com.myapp.myapp.camera.CameraFragment$2.onClick(CameraFragment.java:175)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
05-28 17:09:22.600 1171-1171/com.myapp.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapp.myapp, PID: 1171
java.lang.RuntimeException: takePicture failed
at android.hardware.Camera.native_takePicture(Native Method)
at android.hardware.Camera.takePicture(Camera.java:1523)
at android.hardware.Camera.takePicture(Camera.java:1468)
at com.myapp.myapp.camera.CameraFragment$2.onClick(CameraFragment.java:175)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Кто-нибудь знает, что может быть неправильным? Как вы можете видеть, я всегда получаю две одинаковые ошибки с каждым сделанным снимком.
Любая помощь высоко ценится, приветствует.
Редактировать:
Я поставил охранников, чтобы остановить одиночные касания, регистрирующиеся как multi, как описано здесь: java.lang.RuntimeException: takePicture failed
Еще не повезло