Oracle MAF 和在 Android 6.0 中请求权限(API 级别 23)
Oracle MAF and requesting permissions in Android 6.0 (API level 23)
我有一个使用设备相机拍照的 MAF 应用程序。一切正常,直到我在 S6 运行ning API 23 上测试它,它崩溃了:
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
Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.
所以我在 运行 期间遵循了如何请求权限的说明(我已经安装了 Android 支持库),问题是,方法签名如下所示:
int checkSelfPermission (Context context,
String permission)
我找不到获取上下文引用的方法(所提供的 link 中的示例也使用了 Activity,同样的问题)。我只是不知道如何在 MAF 中执行此操作,因为看起来 Application/Activity 对象没有暴露。
我曾尝试在我的一个 类 中简单地扩展 Activity 并尝试使用 this
调用 checkSelfPermission 方法,但随后出现 运行-time 错误,在阅读了 Activity 是什么之后,我明白了为什么这是错误的。
tl:dr
我们如何处理新的 Android 6(API 级别 23)运行-时间权限请求与 oracle 的移动应用程序框架?
编辑:
因此,根据评论中的讨论,我们可以看到该应用程序应该在 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?为什么这会与位置更新作斗争?
更新 (22/08.2016):
这确实发生了,因为我在构建配置中将目标 SDK 设置为 23。下载新的 Eclipse 只需将其重置为默认值 (21)
旧答案:
我通过下载 OEPE for Neon 解决了这个问题(我使用的是 OEPE for Mars)。
Oracle Enterprise Pack for Eclipse
应用程序现在可以正确生成请求使用相机权限的弹出窗口。
请注意,这会导致位置服务出现问题,并且在请求 GPS 位置时应用程序会崩溃,我还没有找到解决方法或问题的根源。
我有一个使用设备相机拍照的 MAF 应用程序。一切正常,直到我在 S6 运行ning API 23 上测试它,它崩溃了:
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
Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.
所以我在 运行 期间遵循了如何请求权限的说明(我已经安装了 Android 支持库),问题是,方法签名如下所示:
int checkSelfPermission (Context context,
String permission)
我找不到获取上下文引用的方法(所提供的 link 中的示例也使用了 Activity,同样的问题)。我只是不知道如何在 MAF 中执行此操作,因为看起来 Application/Activity 对象没有暴露。
我曾尝试在我的一个 类 中简单地扩展 Activity 并尝试使用 this
调用 checkSelfPermission 方法,但随后出现 运行-time 错误,在阅读了 Activity 是什么之后,我明白了为什么这是错误的。
tl:dr
我们如何处理新的 Android 6(API 级别 23)运行-时间权限请求与 oracle 的移动应用程序框架?
编辑:
因此,根据评论中的讨论,我们可以看到该应用程序应该在 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?为什么这会与位置更新作斗争?
更新 (22/08.2016):
这确实发生了,因为我在构建配置中将目标 SDK 设置为 23。下载新的 Eclipse 只需将其重置为默认值 (21)
旧答案:
我通过下载 OEPE for Neon 解决了这个问题(我使用的是 OEPE for Mars)。
Oracle Enterprise Pack for Eclipse
应用程序现在可以正确生成请求使用相机权限的弹出窗口。
请注意,这会导致位置服务出现问题,并且在请求 GPS 位置时应用程序会崩溃,我还没有找到解决方法或问题的根源。