Cordova插件权限在我的应用程序中不起作用

时间:2019-02-19 10:35:53

标签: cordova cordova-plugins

朋友预先感谢。这是我的第一个问题。 我不是Cordova开发人员,但由于某些情况,我必须处理Cordova应用程序。 我的应用程序以前以Android API级别22为目标,而现在我以API级别26为目标。

从上述API级别开始,有22个android需要运行时权限,我正在尝试在我的应用程序中实现权限代码。

我需要将pdf文件从应用程序复制到设备内存。我已经为复制文件编写了代码,该文件在android API级别22之前都可以正常工作,但在android API级别23以上时不能正常工作。

要执行此操作,我需要在我的Cordova应用中添加权限。

我已使用以下插件获得许可 cordova插件添加cordova-plugin-permission

以下是我的index.js代码

var app = {
    // Application Constructor
        initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
        bindEvents: function() {
            document.addEventListener('deviceready', this.onDeviceReady, false);
        },
     //deviceready Event Handler
     //
     // The scope of 'this' is the event. In order to call the     'receivedEvent'
    // function, we must explicitly call 'app.receivedEvent(...);'
        onDeviceReady: function() {
           app.receivedEvent('deviceready');
		
         // **my permission code**
        var Permission = cordova.plugins.Permission

        var permission = 'android.permission.WRITE_EXTERNAL_STORAGE'

        Permission.has(permission,function(results){
            if(!results[permission])
            {
                Permission.request(permission,function(results){
                    if(results[permission]){
                          alert("permission granted");
                   }
                },alert("permission failed"))
                alert("permission granted failed");
            }
        }, alert("permission failed"))

              
                   asset2sd.copyDir({
                   asset_directory: "www/pdf",
                   destination_directory: "crisispdf",
                 },
                 function () {
                           //alert('success');
                 },
                 function () {
                     //alert('fail');
                 }
                 );  

        
	},
    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

       

        console.log('Received Event: ' + id);
    }
     };

     app.initialize();

以下是我的config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.atlascopco.crisis" version="1.0.13" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Crisis Management</name>
    <description>
        Crisis Management 
    </description>
    <author email="dev@cordova.apache.org" href="http://cordova.io">
        Atlas Copco Team
    </author>
    <content src="index.html" />
    <access origin="*" />
    <access launch-external="yes" origin="mailto:*" />
    <access launch-external="yes" origin="tel:*" />
    <plugin name="cordova-plugin-inappbrowser" spec="^1.7.1" />
    <plugin name="cordova-plugin-wkwebview-engine" spec="^1.1.3" />
    <plugin name="cordova-plugin-permission" spec="^0.1.0" />
    <platform name="android">
        <uses-permission android:maxSdkVersion="26" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:maxSdkVersion="26" android:name="android.permission.READ_EXTERNAL_STORAGE" />
    </platform>
    <engine name="android" spec="^7.1.4" />
</widget>

以下是我在创建调试apk后从android平台下载的Android Manifest文件

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10013" android:versionName="1.0.13" package="com.atlascopco.crisis" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

在chrome浏览器中检查此代码时,请让我知道我的代码有什么问题,它显示以下结果,并且在应用启动enter image description here时未弹出权限弹出窗口

1 个答案:

答案 0 :(得分:0)

尝试此代码

var app = {
    // Application Constructor
        initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
        bindEvents: function() {
            document.addEventListener('deviceready', this.onDeviceReady, false);
        },
     //deviceready Event Handler
     //
     // The scope of 'this' is the event. In order to call the     'receivedEvent'
    // function, we must explicitly call 'app.receivedEvent(...);'
        onDeviceReady: function() {
           app.receivedEvent('deviceready');
		
         // **my permission code**
        var permission = cordova.plugins.permissions;

        permission.hasPermission(permission.WRITE_EXTERNAL_STORAGE,function(results){
            if(!results[permission])
            {
                permission.requestPermission(permission.WRITE_EXTERNAL_STORAGE,function(results){
                    if(results[permission]){
                          alert("permission granted");
                   }
                },alert("permission failed"))
                alert("permission granted failed");
            }
        }, alert("permission failed"))

              
                   asset2sd.copyDir({
                   asset_directory: "www/pdf",
                   destination_directory: "crisispdf",
                 },
                 function () {
                           //alert('success');
                 },
                 function () {
                     //alert('fail');
                 }
                 );  

        
	},
    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

       

        console.log('Received Event: ' + id);
    }
     };

     app.initialize();