Search code examples
javaandroid-6.0-marshmallowandroid-permissionsoracle-maf

Oracle MAF and requesting permissions in Android 6.0 (API level 23)


I have an MAF application that uses the devices camera to take a picture. Everything was working fine until I tested it on an S6 running API 23, where it crashed with:

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()

As far as I can tell this is because of the way Android are handling permission in the newer API's, noted here:

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.

So I followed the instructions on how to request permission during run-time (I've installed Android Support Libraries), the problem is, the method signature looks like this:

int checkSelfPermission (Context context, 
            String permission)

I cannot find a way to get a reference to the context (the example in the provided link also uses an Activity, same problem there). I just don't have the faintest clue how to do this from within MAF, as it seems Application/Activity objects are not exposed.

I have tried simply extending Activity in one of my classes and attempted to call the checkSelfPermission method with this but then I get run-time errors, after reading up on what an Activity is I understand why this is wrong.

tl:dr

How do we handle the new Android 6 (API level 23) run-time permission requests with oracle's mobile application framework?

Edit: So as per the discussion in the comments we can see the app is supposed to still function normally on Android 6, even if you're not requesting permissions at run-time. So I had a look at the AndroidManifest.xml file that MAF is generating on build, and I can see that the permission (from the above exception) android.permission.READ_EXTERNAL_STORAGE is not present:

  <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"/>

Also interesting, is that the GPS location does not update either, and the log is constantly posting this:

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.

So my next question is, how do I influence AndroidManifest.xml within MAF? And why is this struggling with location updates?


Solution

  • UPDATE (22/08.2016):

    This was actually happening because I was setting the target SDK to 23 in my build configurations. Downloading the new Eclipse simply reset this back to the default (21)

    Old Answer:

    I solved this by downloading OEPE for Neon (I was using OEPE for Mars).

    Oracle Enterprise Pack for Eclipse

    The application now correctly generates a popup requesting permission to use the camera.

    Please note, this has created an issue with location services and the app crashes when requesting gps location, I have not yet discovered a fix or the source of the problem.