朋友们提前谢谢。这是我的第一个问题。我不是Cordova开发人员,但由于某些情况,我必须开发Cordova应用程序。我的应用程序以前的目标是Android API级别22,现在我的目标是API级别26。
从上面的API级别,22个机器人需要运行时权限,我正在尝试在我的应用程序中实现权限代码。
我需要将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="[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>
以下是我创建调试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
试试此代码
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();