Oracle MAF和Android 6.0中的请求权限(API级别23)

时间:2016-07-06 08:48:16

标签: java android-6.0-marshmallow android-permissions oracle-maf

我有一个使用设备相机拍摄照片的MAF应用程序。一切都工作正常,直到我在S6运行的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

  

从Android 6.0(API级别23)开始,用户在应用运行时向应用授予权限,而不是在安装应用时授予权限。

所以我按照说明如何在运行时请求权限(我已经安装了Android支持库),问题是,方法签名如下所示:

int checkSelfPermission (Context context, 
            String permission)

我找不到获取上下文引用的方法(提供的链接中的示例也使用了Activity,同样的问题)。我只是不知道如何从MAF中做到这一点,因为它似乎没有公开Application / Activity对象。

我试过简单地在我的一个类中扩展Activity并试图用this调用checkSelfPermission方法,但后来我得到了运行时错误,在阅读了什么是Activity后我明白为什么这是错误的

TL:博士

我们如何使用oracle的移动应用程序框架处理新的Android 6(API级别23)运行时权限请求?

编辑: 因此,根据评论中的讨论,我们可以看到应用程序在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?为什么这会与位置更新一起挣扎?

1 个答案:

答案 0 :(得分:0)

更新(22 / 08.2016):

这实际上是因为我在我的构建配置中将目标SDK设置为23。下载新的Eclipse只需将其重置为默认值(21)

旧答案:

我通过下载OEPE for Neon解决了这个问题(我正在使用OEPE for Mars)。

Oracle Enterprise Pack for Eclipse

应用程序现在可以正确生成一个弹出窗口,请求使用相机的权限。

请注意,这会导致位置服务出现问题,并且在请求gps位置时应用程序崩溃,我还没有发现修复程序或问题的根源。