Search code examples
cordovacordova-plugins

cordova plugin permission not working in my application


Friends Thanks in advance. This is my first question. I am not a Cordova developer but due to some circumstances, I have to work on Cordova application. My application previously targets the Android API level 22 and now I am targetting the API level 26.

From the above API level, 22 androids required runtime permission and I am trying to implement the permission code in my application.

I need to copy a pdf file from my application to device memory. I have already written the code for the copy file which is working fine up to android API level 22 but not working on above android API level 23.

To work this I need to add the permission in my Cordova app.

I have used the following plugin for permission cordova plugin add cordova-plugin-permission

Following is my index.js code

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

Following is my 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="[email protected]" 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>

Following is my Android Manifest file form the android platform after creating the debug apk

<?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>

Please let me know what is the problem in my code when checking this in chrome browser it is showing the following result and the permission popup is not getting at the time of app start enter image description here


Solution

  • Try This Code

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