版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_32377671/article/details/79738017
通过自定义插件方式实现Android平台的动态申请权限功能
在上一章中完成了在Mui中调用Android原生的动态权限请求功能(Android动态申请权限的问题)。虽然说完成了功能,但是在使用上并不是十分的方便。比如说每次要请求权限的时候都要写类名和方法名去引用对应的类的方法。总这么写迟早都会感觉到恶心,虽然说复制粘贴是个好办法,那我们能不能复制粘贴也能少点代码呢?所以这里将会使用自定义插件的形式,来完成请求权限的功能。
一、添加自定义插件模块
说白了就是在原生工程里增加一个类,用于与JS交互。然后将这个类配置到dcloud_properties.xml文件中。然后Mui通过一些方式将这类进行了关联。然后我们就可以在html中调用这个类的相关方法了。这样我们就不用自己去import原生项目中的类了。
基于上一章的内容,这里我在项目中增加了两个类。这两个类的功能如下表所示。这两个类都继承Mui的5+SDK提供的StandardFeature这个类。(其实没必要创建两个类,建一个就可以,这里我只是为了方便)
类 | 作用 |
---|---|
MineTestPlugin | 用来设置对Mui开放的方法 |
MineTestService | 用来初始化相关的配置 |
1.MineTestService类的作用及完整代码:
用于初始化在上一章引入的工具类库。代码如下:
package com.lyan.minemap
import android.content.Context
import android.os.Bundle
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.Utils
import io.dcloud.common.DHInterface.StandardFeature
/**
* 用于初始化工具类库
* Created by Lyan on 18/3/28.
*/
class MineTestService : StandardFeature() {
override fun onStart(context: Context?, bundle: Bundle?, strings: Array<String>?) {
super.onStart(context, bundle, strings)
context?.apply {
Utils.init(applicationContext)//初始化工具类库
LogUtils.w("onStart")
}
}
}
2.MineTestPlugin类的作用及完整代码:
用来配置申请权限的方法,然后给Mui调用(JSONArray中的数据是Mui中要传来的值,接收的顺序与传的顺序要一致。在Mui调用插件中的方法时,将要传的参数要放到数组中。然后在原生中对应方法中按顺序解析JSONArray后,拿到的数据就是Mui中传的参数)。代码如下:
package com.lyan.minemap
import com.blankj.utilcode.util.ObjectUtils
import com.blankj.utilcode.util.PermissionUtils
import org.json.JSONArray
import io.dcloud.common.DHInterface.IWebview
import io.dcloud.common.DHInterface.StandardFeature
import io.dcloud.common.util.JSUtil
/**
* 插件模块
* Created by Lyan on 18/3/28.
*/
class MineTestPlugin : StandardFeature() {
/**
* 用于申请权限的方法
*/
fun permission(iWebview: IWebview, jsonArray: JSONArray) {
val callbackID = jsonArray.optString(1)//回调
val permissionsJsonArray = jsonArray.optJSONArray(0)//获取权限数据
val dataSize = permissionsJsonArray.length()//获取数据的数量
/**
* 对参数进行下判断,没有相关参数就返回错误信息
*/
if (ObjectUtils.isNotEmpty(permissionsJsonArray) && dataSize > 0) {
val permissions: Array<String> = Array(dataSize, { i: Int -> "$i" })//初始化一个String数组
(0 until dataSize).forEach { permissions[it] = (permissionsJsonArray.optString(it)) }//解析数据将数据放到数组中
getPermissions(permissions, iWebview, callbackID)//申请权限
} else {
JSUtil.execCallback(iWebview, callbackID, "请填写要申请的权限!", JSUtil.ERROR, false)
}
}
/**
* 申请权限
*/
private fun getPermissions(permissions: Array<String>, iWebview: IWebview, callbackID: String) {
PermissionUtils.permission(*permissions).callback(object : PermissionUtils.SimpleCallback {
/**
* 权限请求成功
*/
override fun onGranted() {
JSUtil.execCallback(iWebview, callbackID, "权限请求成功!", JSUtil.OK, false)
}
/**
* 权限请求失败
*/
override fun onDenied() {
JSUtil.execCallback(iWebview, callbackID, "权限请求失败!", JSUtil.ERROR, false)
}
}).request()
}
}
3.将自定义的插件配置到dcloud_properties.xml中
属性名 | 属性功能 |
---|---|
name | 用来设置插件的名称,作用相当于标识 |
value | 要引用类的包名+类名 |
二、配置和引用插件
接下来回到HBuilder中,对项目的manifest.json进行配置,将自定义的插件配置进来。配置插件如下图所示:
对主界面的代码修改一下,以使用插件的形式。来完成申请地理位置权限,并获取当前地理位置结果的功能。完整代码如下:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="css/mui.min.css" rel="stylesheet" />
</head>
<body>
<button id="getloc">获取地理位置信息</button>
<script src="js/mui.min.js"></script>
<!-- 配置插件,可单独引出一个js文件 -->
<script>
//权限组的常量
var CALENDAR = "android.permission-group.CALENDAR";
var CAMERA = "android.permission-group.CAMERA";
var CONTACTS = "android.permission-group.CONTACTS";
var LOCATION = "android.permission-group.LOCATION";
var MICROPHONE = "android.permission-group.MICROPHONE";
var PHONE = "android.permission-group.PHONE";
var SENSORS = "android.permission-group.SENSORS";
var SMS = "android.permission-group.SMS";
var STORAGE = "android.permission-group.STORAGE";
document.addEventListener('plusready', function() {
var PLUGIN_NAME = 'MineTestPlugin',
BRIDGE = window.plus.bridge;
window.plus.MineTestPlugin = {
getPermission: function(permissions, successCallback, errorCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code) {
errorCallback(code);
};
callbackID = BRIDGE.callbackId(success, fail);
return BRIDGE.exec(PLUGIN_NAME, "permission", [permissions, callbackID]);
}
};
}, true);
</script>
<script>
mui.init()
mui.plusReady(function() {
//设置点击事件
mui("#getloc")[0].addEventListener("tap", function() {
plus.MineTestPlugin.getPermission([LOCATION],
function(msg) {
//所以在这一步直接获取地理信息即可
plus.geolocation.getCurrentPosition(function(p) {
//获取地理位置成功,弹出省份、城市和街道
alert(p.address.province + p.address.city + p.address.street);
}, function(e) {
alert("获取位置信息失败" + e.message);
});
},
function(msg) {
mui.alert(msg);
});
});
});
</script>
</body>
</html>