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 位置时应用程序会崩溃,我还没有找到解决方法或问题的根源。