从camera预览图进入gallery后,删除所有照片自动返回camera时相机错误退出
从camera预览图进入gallery后,删除所有照片自动返回camera时相机异常退出
小弟在研究android源码时,从camera左下角拍照预览图进入gallery后,删除所有照片自动返回camera时相机会异常退出。
log如下:
E/AndroidRuntime( 6365): java.lang.RuntimeException: java.io.IOException: setPreviewTexture failed
E/AndroidRuntime( 6365): at com.android.camera.AndroidCameraManagerImpl$CameraHandler.handleMessage(AndroidCameraManagerImpl.java:252)
E/AndroidRuntime( 6365): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 6365): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 6365): at android.os.HandlerThread.run(HandlerThread.java:61)
E/AndroidRuntime( 6365): Caused by: java.io.IOException: setPreviewTexture failed
E/AndroidRuntime( 6365): at android.hardware.Camera.setPreviewSurface(Native Method)
E/AndroidRuntime( 6365): at android.hardware.Camera.setPreviewDisplay(Camera.java:654)
E/AndroidRuntime( 6365): at com.android.camera.AndroidCameraManagerImpl$CameraHandler.handleMessage(AndroidCameraManagerImpl.java:250)
E/AndroidRuntime( 6365): ... 3 more
跟踪log走到jni如下位置,
static void android_hardware_Camera_setPreviewSurface(JNIEnv *env, jobject thiz, jobject jSurface)
{
ALOGV("setPreviewSurface");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
sp<IGraphicBufferProducer> gbp;
sp<Surface> surface;
if (jSurface) {
surface = android_view_Surface_getSurface(env, jSurface);
if (surface != NULL) {
gbp = surface->getIGraphicBufferProducer();
}
}
if (camera->setPreviewTarget(gbp) != NO_ERROR) {
jniThrowException(env, "java/io/IOException", "setPreviewTexture failed");
}
}
static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
jobject thiz, jobject jSurfaceTexture)
{
ALOGV("setPreviewTexture");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
sp<IGraphicBufferProducer> producer = NULL;
if (jSurfaceTexture != NULL) {
producer = SurfaceTexture_getProducer(env, jSurfaceTexture);
if (producer == NULL) {
jniThrowException(env, "java/lang/IllegalArgumentException",
"SurfaceTexture already released in setPreviewTexture");
return;
}
}
if (camera->setPreviewTarget(producer) != NO_ERROR) {
jniThrowException(env, "java/io/IOException",
"setPreviewTexture failed");
}
}
后面就不是很懂了,请教各位是否有遇到过相关问题,可否指导一下,十分感谢!
------解决思路----------------------
camera->setPreviewTarget(producer) 主要分析此函数有啥问题
小弟在研究android源码时,从camera左下角拍照预览图进入gallery后,删除所有照片自动返回camera时相机会异常退出。
log如下:
E/AndroidRuntime( 6365): java.lang.RuntimeException: java.io.IOException: setPreviewTexture failed
E/AndroidRuntime( 6365): at com.android.camera.AndroidCameraManagerImpl$CameraHandler.handleMessage(AndroidCameraManagerImpl.java:252)
E/AndroidRuntime( 6365): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 6365): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 6365): at android.os.HandlerThread.run(HandlerThread.java:61)
E/AndroidRuntime( 6365): Caused by: java.io.IOException: setPreviewTexture failed
E/AndroidRuntime( 6365): at android.hardware.Camera.setPreviewSurface(Native Method)
E/AndroidRuntime( 6365): at android.hardware.Camera.setPreviewDisplay(Camera.java:654)
E/AndroidRuntime( 6365): at com.android.camera.AndroidCameraManagerImpl$CameraHandler.handleMessage(AndroidCameraManagerImpl.java:250)
E/AndroidRuntime( 6365): ... 3 more
跟踪log走到jni如下位置,
static void android_hardware_Camera_setPreviewSurface(JNIEnv *env, jobject thiz, jobject jSurface)
{
ALOGV("setPreviewSurface");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
sp<IGraphicBufferProducer> gbp;
sp<Surface> surface;
if (jSurface) {
surface = android_view_Surface_getSurface(env, jSurface);
if (surface != NULL) {
gbp = surface->getIGraphicBufferProducer();
}
}
if (camera->setPreviewTarget(gbp) != NO_ERROR) {
jniThrowException(env, "java/io/IOException", "setPreviewTexture failed");
}
}
static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
jobject thiz, jobject jSurfaceTexture)
{
ALOGV("setPreviewTexture");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
sp<IGraphicBufferProducer> producer = NULL;
if (jSurfaceTexture != NULL) {
producer = SurfaceTexture_getProducer(env, jSurfaceTexture);
if (producer == NULL) {
jniThrowException(env, "java/lang/IllegalArgumentException",
"SurfaceTexture already released in setPreviewTexture");
return;
}
}
if (camera->setPreviewTarget(producer) != NO_ERROR) {
jniThrowException(env, "java/io/IOException",
"setPreviewTexture failed");
}
}
后面就不是很懂了,请教各位是否有遇到过相关问题,可否指导一下,十分感谢!
------解决思路----------------------
camera->setPreviewTarget(producer) 主要分析此函数有啥问题