【问题标题】:Cordova App 'Android permission Cordova plugin' is not showing permission dialogCordova 应用程序“Android 权限 Cordova 插件”未显示权限对话框
【发布时间】:2016-12-29 00:11:41
【问题描述】:

我正在为我的 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
  • 您是否尝试过完全卸载您的应用并重新安装?这可能会清除以前被拒绝的权限并给你一个新的开始。

标签: cordova permissions cordova-plugins android-6.0-marshmallow


【解决方案1】:

通过将相关权限和功能添加到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】:

    在config.xml文件中,尝试添加

    然后构建应用程序。它会自动覆盖平台文件夹中的 AndroidManifest.xml 文件,因此带有拒绝和允许按钮的弹出对话框可以正常工作。

    请参阅以下链接以获取更多参考。

    https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

    【讨论】:

      【解决方案3】:

      亲爱的,我也有同样的问题。没有出现请求对话框。在对我的代码进行了一些关注之后,我发现 var permissions = cordova.plugins.permissions 是在 DeviceReady() 函数中定义的,而在另一边我调用 checkPermissionCallback() 作为回调函数,它不在 DeviceReady() 函数中,所以var 权限未在该函数中定义(范围不同)。所以 checkPermissionCallback 必须在 DeviceReady() 函数中定义。

      【讨论】:

        【解决方案4】:

        我不熟悉您使用的插件,但我能够在我的 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 请求该权限。
        • 您应该能够使用您的图像选择器插件,而无需使用 JavaScript 明确请求许可。根据上述方法,权限请求仍会在第一次使用时自动发生一次。如果用户拒绝请求,您仍然需要向图像选择器代码添加通用错误处理以进行处理。您返回的错误信息应该表明这一点。
        【解决方案5】:

        在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

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

        【讨论】:

          【解决方案6】:

          就在昨天,我发现了同样的问题并开始查看 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);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-23
            • 2015-10-30
            • 2016-02-29
            • 2021-03-06
            • 2020-03-05
            • 2018-08-01
            相关资源
            最近更新 更多