使用Mui调用Android拓展方法来完成动态申请权限的功能
说白了还是JS与原生交互,只不过这里mui为我们封装了好了交互的功能,我们只需要知道如何调用就行了,这里将会以上一章的内容为基础,因为为了做本章的准备已经将如何引入Html5+插件的配置,在上一章进行了说明(Mui本地打包笔记(二)集成第三方SDK(以百度地图为例))。这一章将会以获取地理位置信息来演示如何动态请求权限。
为了方便这里我用了一个第三方的工具类库。功能十分丰富(传送门)。在项目中引入【implementation ‘com.blankj:utilcode:1.13.5’】。
这里注意一下,如果各位用的库的版本跟我相同的话,初始化的方法是这样的。方法的参数传的Context类型的对象。
如果版本低于我使用的版本的话,初始化的传入的参数是Application类型的对象(具体从那个版本变得这个我倒是不清楚)。如果要用到这个库请注意一下初始化这块。
一、在Android原生项目中增加要被调用方法:
这里我创建了一个工具类,添加了一个用于初始化工具类库的方法和请求权限的方法。
package com.lyan.minemap;
import android.content.Context;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ObjectUtils;
import com.blankj.utilcode.util.PermissionUtils;
import com.blankj.utilcode.util.Utils;
/**
* Created by Lyan on 18/3/28.
*/
public class Tools {
/**
* 请求权限的回调
*/
interface CallBack{
void success();
void failure();
}
/**
* 初始化工具类
* @param context
*/
public static void initUtils(Context context){
Utils.init(context.getApplicationContext());
}
/**
* 想要申请的权限
* @param permissions
*/
public static void permission(String[] permissions, final CallBack callBack){
PermissionUtils.permission(permissions).callback(new PermissionUtils.SimpleCallback() {
/**
* 权限请求成功
*/
@Override
public void onGranted() {
if (ObjectUtils.isNotEmpty(callBack)) callBack.success();
LogUtils.i("权限请求成功!");
}
/**
* 权限请求失败
*/
@Override
public void onDenied() {
if (ObjectUtils.isNotEmpty(callBack)) callBack.failure();
LogUtils.i("权限请求失败!");
}
}).request();
}
}
二、在Mui项目里添加一个界面并添加一个获取位置信息的功能:
创建一个新的界面,创建完了之后将这个新建的界面设为程序的入口,界面中的代码如下(在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>
<script type="text/javascript">
mui.init()
mui.plusReady(function() {
//初始化工具类库
var mainAct = plus.android.runtimeMainActivity();
//参数一:包名+类名
//参数二:方法名s
//参数三:对应java方法的参数
plus.android.invoke("com.lyan.minemap.Tools", "initUtils", mainAct);
});
mui("#getloc")[0].addEventListener("tap", function() {
//设置回调函数
var callBack = plus.android.implements("com.lyan.minemap.Tools$CallBack", {
"success": function() {
//申请权限成功或已经获取到了权限都会执行到这里
//所以在这一步直接获取地理信息即可
plus.geolocation.getCurrentPosition(function(p) {
//获取地理位置成功,弹出省份和城市
alert(p.address.province + p.address.city);
}, function(e) {
alert("获取位置信息失败" + e.message);
});
},
"failure": function() {
mui.alert("权限请求失败!");
}
});
//调用申请权限的静态方法
plus.android.invoke("com.lyan.minemap.Tools", "permission", ["android.permission-group.LOCATION"], callBack);
});
</script>
</body>
</html>
三、效果演示:
这样在Mui中调用原生动态申请权限的功能就完成了,这里放一张效果图。
四、申请权限的字符串
在上面测试的网页中,在申请权限的部分添加了这么一个字符串“android.permission-group.LOCATION”,这个可不是随便填写的。
五、总结
虽然以这种方式完成了动态请求权限的功能,但是MUI提供了自定义插件的方式。如果以插件的方式使用权限请求的功能,那么会节省不少代码,尤其是有多个地方需要申请权限的时候(脑补即可)。所以下一章Mui本地打包笔记(四)Android自定义插件的配置将会以自定义插件的形式实现动态权限的申请。