Android - 安装我的应用程序时,默认设置 "No permission allowed"?

Android - when ever my app is installed, by default "No permission allowed" is set?

我的应用程序是通过 Google Play 或 USB 安装的 (与所有其他通用应用程序一样使用麦克风、摄像头),默认情况下应用程序获取 "No permission allowed".

因此,在全新安装后它永远无法运行。

除非有人手动进入应用程序设置并进行更改。

我做错了什么?为什么会导致默认进入拒绝权限模式?

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

编辑:

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

从 Android Marshmallow (6.0) 开始,您必须在 运行 时请求权限。这样用户可以手动接受或拒绝您需要的每个权限。
有关实现权限的帮助,请参阅 Android documentation

这可以防止应用程序在未经用户同意的情况下'secretly'使用私人设备和用户信息。

从 Android M 开始,您需要为所需的每个权限请求运行时权限。

请求联系人权限的示例是:-

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);
 }
}

您需要在代码中为Marshmallow及以上设备设置权限。插件也提供此功能。

Sample reference mentioning the same 即使提到了 ionic,在 cordova 项目中也需要使用相同的方法

要获得权限状态,请复制如下。

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

并请求授权

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);
}