现象描述
刷入user版本,进入相机,相机crash,闪退。
log分析
--------- beginning of crash
01-01 12:00:30.736 6939 6939 E AndroidRuntime: FATAL EXCEPTION: main
01-01 12:00:30.736 6939 6939 E AndroidRuntime: Process: org.codeaurora.snapcam, PID: 6939
01-01 12:00:30.736 6939 6939 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {org.codeaurora.snapcam/com.android.camera.CameraActivity}: java.lang.IllegalArgumentException: width must be positive
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3823)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3855)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1817)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.os.Looper.loop(Looper.java:193)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6746)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: width must be positive
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.internal.util.Preconditions.checkArgumentPositive(Preconditions.java:268)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.params.StreamConfiguration.<init>(StreamConfiguration.java:63)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration.unmarshal(MarshalQueryableStreamConfiguration.java:59)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration$MarshalerStreamConfiguration.unmarshal(MarshalQueryableStreamConfiguration.java:38)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.marshal.impl.MarshalQueryableArray$MarshalerArray.unmarshal(MarshalQueryableArray.java:93)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:532)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:502)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.getStreamConfigurationMap(CameraMetadataNative.java:913)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.access$400(CameraMetadataNative.java:78)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative$5.getValue(CameraMetadataNative.java:570)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:402)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:373)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:223)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.camera.CaptureModule.setUpCameraOutputs(CaptureModule.java:2056)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.camera.CaptureModule.openProcessors(CaptureModule.java:2803)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.camera.CaptureModule.onResumeAfterSuper(CaptureModule.java:2822)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at com.android.camera.CameraActivity.onResume(CameraActivity.java:1851)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1413)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.Activity.performResume(Activity.java:7300)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3815)
01-01 12:00:30.736 6939 6939 E AndroidRuntime: ... 11 more
上面的log可以看出,获取Matadata CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
时,得到的相机支持的尺寸,有width=0 或者height=0 的现象。
解决方案
1.上层规避
diff --git a/frameworks/base/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java b/frameworks/base/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java
old mode 100644
new mode 100755
index ebc74f0..8e2b73e
--- a/frameworks/base/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java
+++ b/frameworks/base/core/java/android/hardware/camera2/marshal/impl/MarshalQueryableArray.java
@@ -90,8 +90,12 @@
array = Array.newInstance(mComponentClass, arraySize);
for (int i = 0; i < arraySize; ++i) {
+ /*meig:jicong.wang modify for bug 7547 start {@*/
Object elem = mComponentMarshaler.unmarshal(buffer);
- Array.set(array, i, elem);
+ if (null != elem) {
+ Array.set(array, i, elem);
+ }
+ /*meig:jicong.wang modify for bug 7547 end @}*/
}
} else {
// Dynamic size, use an array list.
@@ -100,7 +104,11 @@
// Assumes array is packed tightly; no unused bytes allowed
while (buffer.hasRemaining()) {
Object elem = mComponentMarshaler.unmarshal(buffer);
- arrayList.add(elem);
+ /*meig:jicong.wang modify for bug 7547 start {@*/
+ if (null!=elem) {
+ arrayList.add(elem);
+ }
+ /*meig:jicong.wang modify for bug 7547 end @}*/
}
int arraySize = arrayList.size();
2:驱动层分析解决。