Cordova应用程序“Android权限Cordova插件”未显示权限对话框。

5
我计划在我的Cordova应用程序中使用'imagepicker'插件从手机图库获取图片并使用它们。我正在Android 6.0设备上测试我的应用程序,这是问题所在。Marshmallow Android 6.0需要运行时权限,而不像旧版本“它能够在旧版本上工作”,但在API 23或更高版本上打开相册时会立即关闭并导致应用程序崩溃。当我搜索时,发现我需要获得权限才能进行操作。因此,我开始使用“Android权限Cordova插件”,并复制了他们在此页面中提供的示例:https://www.npmjs.com/package/cordova-plugin-android-permissions
var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.CAMERA, checkPermissionCallback, null);

function checkPermissionCallback(status) {
  if(!status.hasPermission) {
    var errorCallback = function() {
      console.warn('Camera permission is not turned on');
    }

    permissions.requestPermission(
      permissions.CAMERA,
      function(status) {
        if(!status.hasPermission) errorCallback();
      },
      errorCallback);
  }
}

控制台提示:“相机权限未开启”,但没有弹出权限对话框。

后来我又搜索了一下,并找到了这个已解决的问题和它的答案,所以我安装了 'cordova-plugin-diagnostic' 并尝试使用以下代码:

function requestPermission(){
    cordova.plugins.diagnostic.requestRuntimePermission(function(status){
        switch(status){
            case cordova.plugins.diagnostic.runtimePermissionStatus.GRANTED:
                console.log("Permission granted (or already granted) - call the plugin");
                // call SQLite plugin
                break;
            case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED:
                console.log("Permission denied - ask again");
                alert("Come on user, we really need this. I'll ask again...");
                requestPermission();
                break;
            case cordova.plugins.diagnostic.runtimePermissionStatus.DENIED_ALWAYS:
                console.log("Permission permanently denied");
                alert("Well that's it, we're dead Jim");
                navigator.app.exitApp();
                break;
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    }, cordova.plugins.diagnostic.runtimePermission.READ_PHONE_STATE);
}
requestPermission();

应用程序关闭时没有弹出对话框,我认为我不知道这个插件应该做什么,也不知道如何获得打开图库的权限。如果有人能给我一个完整的例子来打开图库并获取权限选择图片,那将是非常有帮助的。
对于我的英语表达不好,我很抱歉,感谢您的耐心等待。

尝试一下这个,它可能有效 stackoverflow.com/a/41221852/5488468 - Bipin Bharti
你尝试过完全卸载应用程序并重新安装吗?这可能会清除之前被拒绝的权限并给您一个全新的起点。 - Alex
6个回答

3

我通过在 platforms/android/AndroidManifest.xml 中添加相关权限和功能,成功显示了权限请求。

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" android:required="true" />

2

1
我也遇到了同样的问题。请求对话框未出现。经过对代码的仔细检查,我发现 cordova.plugins.permissions 变量是在 DeviceReady() 函数中定义的,而我在另一边调用 checkPermissionCallback() 作为回调函数,该函数不在 DeviceReady() 函数中,因此 var permissions 在该函数中未定义(作用域不同)。因此,checkPermissionCallback 必须在 DeviceReady() 函数中定义。

0

我不熟悉你使用的插件,但我能够在我的config.xml中使用cordova-plugin-settings-hook来解决类似的问题:

<platform name="android"> <config-file parent="/*" platform="android" target="AndroidManifest.xml"> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

要在您的config.xml中使用上述设置,您还需要编辑widget属性以包括一个附加属性:xmlns:android="http://schemas.android.com/apk/res/android"


问题在于Android 6.0需要运行时权限,那么我如何在运行时使用JavaScript请求该权限。 - Mahmoud Mabrouk
您应该能够使用JavaScript无需显式请求权限来使用图像选择器插件。基于上述方法,权限请求仍将在第一次使用时自动发生一次。您仍需要向图像选择器代码添加通用错误处理程序以处理用户拒绝请求的情况。您收到的错误信息应指示此情况。 - Neil Cresswell

0

在 Cordova config.xml 中将 Android 目标版本设置为 API 23 后

<preference name="android-targetSdkVersion" value="23" />
<preference name="android-minSdkVersion" value="19" />

您可以在android/androidManifest.xml文件中继续指定所需的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="true" /> 

通过这个设置,您可以使用任何适用于 Cordova 的 Android 权限插件,例如https://www.npmjs.com/package/cordova-plugin-android-permissions

根据您想要实现的目标,这应该可以解决大部分或全部问题。


0

就在昨天,我遇到了同样的问题,并开始查看npm文档(链接:https://www.npmjs.com/package/cordova-plugin-permission),但它满足了我的需求,找到了解决方案。

        var permissions = plugins.Permission;

        permissions.has('android.permission.CAMERA', function (status) {
          if(!status.has) {
            var errorCallback = function() {
              console.warn('Camera permission is not turned on');
            }

            permissions.request(
              'android.permission.CAMERA',
              function(status) {
                if(!status.has) errorCallback();
              },
              errorCallback);
          }
        }, alert);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接