Android 10 中的相机意图权限
Posted
技术标签:
【中文标题】Android 10 中的相机意图权限【英文标题】:Camera intent permissions in Android 10 【发布时间】:2020-09-29 10:53:53 【问题描述】:在处理在 android 10 中使用具有隐式意图的相机应用时遇到一个不寻常的问题。我正在使用 Big Nerd Ranch Android 编程教科书(第 4 版)第 16 章来学习如何拍照并将它们存储在一个应用程序。本书介绍了设置 FileProvider、授予相机应用程序写入特定 URI 的权限,然后使用 MediaStore 的隐式 Intent 启动默认相机应用程序的过程。在完全按照书中的说明进行操作后,我在模拟器(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 ComponentInfocom.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)
在谷歌上搜索这个问题后,我发现了另一个 *** 帖子: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 模拟器以及我的物理设备上都能正常运行。
此时,我不想更改我在本书示例应用程序中使用的方法,因为我在其他地方看到过同样的代码。这是什么原因造成的?什么可以使我的物理设备上的一切正常,但在模拟器上却不行?什么可以使相同的方法在模拟器上的一个应用程序中工作,但不能在同一个模拟器上的不同应用程序中工作?我在第二个应用程序中使用的某些依赖项是否无意中使这张照片正常工作? (第二个应用比书中列出的应用更复杂,所以依赖比较多)
非常感谢任何建议!
【问题讨论】:
不,你不需要CAMERA
权限来拍摄这样的照片,而 AFAIK 并没有随着 10 改变。(但是,如果你在清单中列出该权限,你必须也提前在运行时请求它;否则你会得到一个SecurityException
。显然,这样做是为了不混淆可能手动禁用你的应用程序权限的最终用户。)给定的异常似乎更能说明存储权限问题,而不是相机。请edit您的问题提供完整的堆栈跟踪;即,您发布的那个周围的所有红线
@MikeM。感谢您的答复!我已经发布了整个堆栈跟踪。
好的,长话短说,这似乎是相机应用程序中的一个错误,最近已更正。检查您的应用程序是否具有 EXIF 元数据内容的 ACCESS_FINE_LOCATION
权限时崩溃,并且您的应用程序显然没有在清单中列出任何 <uses-permission>
元素。基本上,等待模拟器的更新,或者——如果你真的,真的想避免这种可能性——你可以添加一些<uses-permission>
;甚至不必是真实的。不过,这有点 hacky。我可能会依赖更新,除非你需要一些许可
@MikeM。非常感谢您的详细回复!我继续在我的清单中添加了 INTERNET 权限,只是为了好玩,它起作用了。看起来我的 Android Studio 有一个可用的更新,所以我也可以尝试一下,看看他们是否修复了它。我对 Android 开发世界还很陌生,所以我想我会问:你是怎么知道这个奇怪的错误的?我渴望提高我的 Android 调试技能,而且我很确定我自己不会想出那个....再次感谢!
没问题!很高兴这有效。对于这个,我基本上只是阅读了堆栈跟踪,并检查了源代码。最后一个Caused by
部分通常是最相关的,我们看到在com.android.camera.CameraActivity.shouldUseNoOpLocation()
中抛出了异常。该方法中实际上只有一个地方可能导致这种情况,但首先有一个空检查。不过,查看历史记录表明,该检查是最近才添加的,并且鉴于所有行号都完全匹配,我非常有信心您正在运行的版本只是一点点......
【参考方案1】:
你分享的内容我已经去了,它不再有用了。 我在'Nexus One API 29'模拟器中面临同样的问题@Austin Promenschenkel。虽然我没有遇到“Pixel 3XL”的任何问题。 我担心的是,我们是否有可能在使用任何物理设备时面临同样的问题?如果是,那么我们应该如何处理它。
【讨论】:
以上是关于Android 10 中的相机意图权限的主要内容,如果未能解决你的问题,请参考以下文章