【发布时间】:2016-09-22 09:32:32
【问题描述】:
我有一个使用设备相机拍照的 MAF 应用程序。一切正常,直到我在运行 API 23 的 S6 上对其进行了测试,但它崩溃了:
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=3432, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
据我所知,这是因为 Android 在新 API 中处理权限的方式,此处注明:
https://developer.android.com/training/permissions/requesting.html
从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。
所以我按照说明如何在运行时请求权限(我已经安装了 Android 支持库),问题是,方法签名如下所示:
int checkSelfPermission (Context context,
String permission)
我找不到获取上下文引用的方法(提供的链接中的示例也使用了 Activity,同样的问题)。我只是不知道如何从 MAF 中执行此操作,因为它似乎没有暴露 Application/Activity 对象。
我尝试在我的一个类中简单地扩展 Activity 并尝试使用 this 调用 checkSelfPermission 方法,但是在阅读了 Activity 是什么之后我得到了运行时错误,我明白为什么这是错误的。
tl:dr
我们如何使用 oracle 的移动应用程序框架处理新的 Android 6(API 级别 23)运行时权限请求?
编辑:
因此,根据 cmets 中的讨论,我们可以看到该应用程序应该在 Android 6 上仍能正常运行,即使您没有在运行时请求权限。
所以我查看了 MAF 在构建时生成的 AndroidManifest.xml 文件,我可以看到权限(来自上述异常)android.permission.READ_EXTERNAL_STORAGE 不存在:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<permission android:name="com.bsaf.atlas.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="com.bsaf.atlas.permission.C2D_MESSAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET"/>
另外有趣的是,GPS 位置也没有更新,并且日志不断发布:
07-07 02:07:13.089 2174 2174 E LocationProvider: Caught security exception registering for location updates from system. This should only happen in DumpRenderTree.
所以我的下一个问题是,我如何影响 MAF 中的 AndroidManifest.xml?为什么要在位置更新上苦苦挣扎?
【问题讨论】:
-
Oracle MAF 尚未通过 Android 6/API 级别 23 的认证,Android 5/API 21 是当前的认证级别 - oracle.com/technetwork/developer-tools/maf/documentation/…。让我问问 MAF 产品管理团队何时支持 Android 6,以及何时支持运行时权限。
-
抱歉,稍作修正。我们在运行时支持 Android 6,但在构建时支持 Android 5。不过,我仍然需要检查我们如何涵盖新的 Android 6 运行时权限。
-
太棒了,感谢您的回复!我急切地等待更多信息。
-
一夜之间收到了 MAF PM 团队的回复:即将发布的 MAF 版本(很可能是 MCS v2.4)将支持 API 23。由于作为 Oracle 员工的 Oracle 政策,我不能公开承诺此版本的 eta,但可以说大约在年底。如果您想了解更多详细信息,我的建议是向 Oracle 支持提出查询。
-
进一步回复:“正如您提到的,Android 6 设备支持 MAF 应用程序,并且认证矩阵中列出了许多 Android 6 设备。安装在这些设备上时,应用程序的行为将是与 Android 5 上的应用程序相同,在这种特殊情况下,用户不会看到动态权限,而是会看到从 GooglePlay 商店下载应用程序时列出的应用程序使用的权限。”
标签: java android-6.0-marshmallow android-permissions oracle-maf