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