Cordova App' Android权限Cordova插件'没有显示权限对话框

时间:2016-12-29 00:11:41

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

我正在使用' imagepicker'我的cordova应用程序的插件,以从移动图库中获取图像并使用它们。我在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();

应用程序关闭,没有对话框显示,我想我不能得到这个插件应该做什么以及如何获得打开图库的权限。如果有人可以给我一个完整的例子来打开画廊并在允许的情况下选择图像,那将是非常有帮助的。

抱歉我的英语,感谢您的耐心等待。

6 个答案:

答案 0 :(得分:2)

我可以通过向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" />

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

enter image description here

,然后构建应用。它将自动覆盖platforms文件夹中的AndroidManifest.xml文件,因此带有deny和allow按钮的弹出对话框可以正常工作。

请参见下面的链接以获取更多参考。

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

答案 3 :(得分: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"

答案 4 :(得分: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

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

答案 5 :(得分: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);