Android camera “java.lang.IllegalArgumentException: width must be positive” 分析

现象描述

刷入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:驱动层分析解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值