我在处理在Android 10中使用隐式意图与相机应用程序时遇到了一个不寻常的问题。我正在使用Big Nerd Ranch Android编程教材(第四版)第16章,学习如何拍照并将其存储在应用程序中。该书介绍了设置FileProvider、授予相机应用程序写入特定URI的权限,然后使用来自MediaStore的隐式意图启动默认相机应用程序的过程。按照书中的说明一字不漏地操作后,在模拟器(Pixel 3XL,Android 10,API 29)上启动了该应用程序。当我点击我的应用程序中的相机按钮时,出现以下错误:
通过谷歌搜索此问题,我发现了另一个 StackOverflow 帖子:Camera crashing on Android 10 when launching intent。该帖子中的回复指出,在清单中放置相机权限并在运行时请求权限是修复该问题所必需的。然而,本书认为这并不是必要的。本书的方法实际上并没有直接使用相机硬件,而是启动了内置相机应用程序并告诉它将输出图像存储在特定位置。我愿意尝试简单地添加权限代码,但这就有些奇怪了...
1)我有一个运行 Android 10、API 29 的物理 Pixel 3 XL。完全相同的代码在物理设备上正常工作。
2)在运行 Android 9、API 28 的 Pixel 3 XL 模拟器上运行完全相同的代码也能正常工作。
3)我创建了一个不同的应用程序,并使用本书中概述的完全相同的方法在该应用程序中拍摄照片。该应用程序在 Android 9 和 10 模拟器以及我的物理设备上均可正常工作。
在这一点上,我不想改变我在样例应用程序中使用的方法,因为我已经看到这个相同的代码在其他地方工作过。是什么导致了这种情况?是什么让所有东西在我的物理设备上正常工作,但在模拟器上不行?是什么让同一方法在模拟器上的一个应用程序中起作用,而在同一模拟器上的另一个应用程序中不起作用?是我在第二个应用程序中使用的某些依赖关系无意中使这个拍照功能起作用吗?(第二个应用程序比书中列出的应用程序复杂得多,因此有更多的依赖关系)
非常感谢您的任何建议!
2020-06-09 23:53:23.092 5894-5894/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.camera2, PID: 5894
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.camera2/com.android.camera.CaptureActivity}: java.lang.NullPointerException: Attempt to get length of null array
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to get length of null array
at com.android.camera.CameraActivity.shouldUseNoOpLocation(CameraActivity.java:1753)
at com.android.camera.CameraActivity.onCreateTasks(CameraActivity.java:1438)
at com.android.camera.util.QuickActivity.onCreate(QuickActivity.java:114)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
1)我有一个运行 Android 10、API 29 的物理 Pixel 3 XL。完全相同的代码在物理设备上正常工作。
2)在运行 Android 9、API 28 的 Pixel 3 XL 模拟器上运行完全相同的代码也能正常工作。
3)我创建了一个不同的应用程序,并使用本书中概述的完全相同的方法在该应用程序中拍摄照片。该应用程序在 Android 9 和 10 模拟器以及我的物理设备上均可正常工作。
在这一点上,我不想改变我在样例应用程序中使用的方法,因为我已经看到这个相同的代码在其他地方工作过。是什么导致了这种情况?是什么让所有东西在我的物理设备上正常工作,但在模拟器上不行?是什么让同一方法在模拟器上的一个应用程序中起作用,而在同一模拟器上的另一个应用程序中不起作用?是我在第二个应用程序中使用的某些依赖关系无意中使这个拍照功能起作用吗?(第二个应用程序比书中列出的应用程序复杂得多,因此有更多的依赖关系)
非常感谢您的任何建议!