Android 10中的相机意图权限

3
我在处理在Android 10中使用隐式意图与相机应用程序时遇到了一个不寻常的问题。我正在使用Big Nerd Ranch Android编程教材(第四版)第16章,学习如何拍照并将其存储在应用程序中。该书介绍了设置FileProvider、授予相机应用程序写入特定URI的权限,然后使用来自MediaStore的隐式意图启动默认相机应用程序的过程。按照书中的说明一字不漏地操作后,在模拟器(Pixel 3XL,Android 10,API 29)上启动了该应用程序。当我点击我的应用程序中的相机按钮时,出现以下错误:

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) 

通过谷歌搜索此问题,我发现了另一个 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 模拟器以及我的物理设备上均可正常工作。
在这一点上,我不想改变我在样例应用程序中使用的方法,因为我已经看到这个相同的代码在其他地方工作过。是什么导致了这种情况?是什么让所有东西在我的物理设备上正常工作,但在模拟器上不行?是什么让同一方法在模拟器上的一个应用程序中起作用,而在同一模拟器上的另一个应用程序中不起作用?是我在第二个应用程序中使用的某些依赖关系无意中使这个拍照功能起作用吗?(第二个应用程序比书中列出的应用程序复杂得多,因此有更多的依赖关系)
非常感谢您的任何建议!

@MikeM,谢谢您的回复!我已经发布了整个堆栈跟踪。 - Austin Promenschenkel
2
好的,长话短说,这似乎是相机应用程序中最近纠正的一个错误。当检查您的应用程序是否具有“ACCESS_FINE_LOCATION”权限以进行EXIF元数据处理时,它会崩溃,并且您的应用程序显然在清单中没有列出任何“<uses-permission>”元素。基本上,等待模拟器的更新,或者 - 如果您真的非常想避免在现场出现这种可能性 - 您可以添加一些“<uses-permission>”,甚至不必是真实的。不过,这有点hacky,我可能会依赖于更新,除非您需要某些权限。 - Mike M.
@MikeM。非常感谢您详细的回复!我已经在我的清单中添加了INTERNET权限,只是为了好玩,它起作用了。看起来我的Android Studio有一个可用的更新,所以我可能会尝试一下,看看他们是否已经修复了它。我对Android开发世界还比较新,所以我想问一下:你是怎么知道这个奇怪的bug的?我渴望提高我的Android调试技能,我很确定我自己不会想出来...再次感谢! - Austin Promenschenkel
你好@MikeM,我已经查看了您分享的内容,很有用。 我在“Nexus One API 29”仿真器上遇到了与“Austin Promenschenkel”类似的问题。尽管我在“Pixel 3XL”上没有遇到任何问题。 我的担心是,我们是否可能在任何物理设备上遇到相同类型的问题?如果是,我们该如何处理? - Chanchal Shakti
@ChanchalShakti 当然,设备软件中总是存在着错误的可能性。不过,我并没有太多一般性的建议,很抱歉。这些错误最终必须由制造商/供应商来修复。如果您能像我们在这里做的那样确定问题,那么您可以尝试部署一个修复方案,至少是暂时的,如果可能的话。不过,我想大多数这样的错误并不像这个那么容易解决,因为这里的所有内容都是开源的。 - Mike M.
显示剩余4条评论
1个回答

0

我已经查看了您分享的内容,它非常有用。 我和@Austin Promenschenkel一样,在“Nexus One API 29”模拟器上遇到了同样的问题。虽然我在“Pixel 3XL”上没有遇到任何问题。 我的担忧是,我们是否可能在任何物理设备上遇到同样的问题?如果是,我们应该如何处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接