2

My app when-ever is installed via Google Play or USB (which use microphone, camera just like all other general app), by default the app gets "No permission allowed".

As a result it never works after the installation as fresh install.

Unless someone manually go in the app settings and change it.

enter image description here

What am i doing wrong? why its causing default into permission denied mode?

AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />

EDIT:

C:\cordova\tpt>cordova plugin add cordova.plugins.diagnostic
Fetching plugin "cordova.plugins.diagnostic" via npm
Installing "cordova.plugins.diagnostic" for android
ANDROID_HOME=C:\Users\tpt\AppData\Local\Android\sdk
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_121
Subproject Path: CordovaLib
null
org.xwalk:xwalk_core_library:23+
Incremental java compilation is an incubating feature.
:clean FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':clean'.
> Unable to delete directory: C:\cordova\tpt\platforms\android\build\outputs\apk

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.83 secs
Failed to install 'cordova.plugins.diagnostic':Error: cmd: Command failed with exit code 1
    at ChildProcess.whenDone (C:\cordova\tpt\platforms\android\cordova\node_modules\cordova-common\src\superspawn.js:169:23)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:886:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
Error: cmd: Command failed with exit code 1

3 Answers3

2

You need to set permissions for Marshmallow and above devices in code. Plugin provides this capability as well.

Sample reference mentioning the same Even if it is mentioned for ionic, same methodology needs to be used in cordova projects

To get permission status , replicate like following.

cordova.plugins.diagnostic.getPermissionAuthorizationStatus(function (status) {
  console.log(status);
  switch (status) {
    case cordova.plugins.diagnostic.runtimePermissionStatus.GRANTED:
      //call the target method
      break;
    case cordova.plugins.diagnostic.runtimePermissionStatus.NOT_REQUESTED:
      setPermission();
      break;
    case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED:
      setPermission();
      break;
    case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED_ALWAYS:
      setPermission();
      break;
  }
}, this.errorCallback, cordova.plugins.diagnostic.runtimePermission.ACCESS_COARSE_LOCATION);

And to request authorization

function setPermission() {
  cordova.plugins.diagnostic.requestLocationAuthorization(function (status) {
    switch (status) {
      case cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED:
        break;
      case cordova.plugins.diagnostic.permissionStatus.DENIED:
        break;
      case cordova.plugins.diagnostic.permissionStatus.GRANTED:
        //TODO : Call native plugin.
        break;
      case cordova.plugins.diagnostic.permissionStatus.GRANTED_WHEN_IN_USE:
        break;
    }
  }, function (error) { }, cordova.plugins.diagnostic.locationAuthorizationMode.ALWAYS);
}
Sreehari
  • 5,621
  • 2
  • 25
  • 59
  • Sir, i install the cordova plugin but failed, and when i tried your code in my index.html i do not get any alert triggers. Please kindly see my EDIT. i am using cordova 6.xx –  Mar 30 '17 at 13:18
  • 1
    If you can remove your android platform and add again. Then try adding necessary plugin's after this re-adding android platform. – Sreehari Mar 31 '17 at 07:37
  • 1
    And try with cordova plugin add cordova.plugins.diagnostic.api-22 Go through this link https://github.com/dpa99c/cordova-diagnostic-plugin – Sreehari Mar 31 '17 at 07:39
  • Thank you. indeed it was Android 6.0.1 issue, where you need to use this great plugin. Thanks man !!!!! –  Mar 31 '17 at 08:39
  • 1
    @YumYumYum Glad to help. Happy Coding – Sreehari Mar 31 '17 at 08:58
0

Starting from Android Marshmallow (6.0), you have to request the permissions at run-time. This way the user can manually accept or deny each permission you need.
For help on implementing permissions see the Android documentation.

This prevents apps from 'secretly' using private device and user information without their consent.

RobCo
  • 6,240
  • 2
  • 19
  • 26
0

From Android M and further, you need to ask for runtime permission for each permissions needed.

An example of asking permission for CONTACTS will be :-

if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.READ_CONTACTS)
    != PackageManager.PERMISSION_GRANTED) {

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

} else {

    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);
 }
}