android插件做动态权限,Mui本地打包笔记(四)Android自定义插件的配置(以动态申请权限为例)...

通过自定义插件方式实现Android平台的动态申请权限功能

在上一章中完成了在Mui中调用Android原生的动态权限请求功能(Android动态申请权限的问题)。虽然说完成了功能,但是在使用上并不是十分的方便。比如说每次要请求权限的时候都要写类名和方法名去引用对应的类的方法。总这么写迟早都会感觉到恶心,虽然说复制粘贴是个好办法,那我们能不能复制粘贴也能少点代码呢?所以这里将会使用自定义插件的形式,来完成请求权限的功能。

一、添加自定义插件模块

说白了就是在原生工程里增加一个类,用于与JS交互。然后将这个类配置到dcloud_properties.xml文件中。然后Mui通过一些方式将这类进行了关联。然后我们就可以在html中调用这个类的相关方法了。这样我们就不用自己去import原生项目中的类了。

基于上一章的内容,这里我在项目中增加了两个类。这两个类的功能如下表所示。这两个类都继承Mui的5+SDK提供的StandardFeature这个类。(其实没必要创建两个类,建一个就可以,这里我只是为了方便)

作用

MineTestPlugin

用来设置对Mui开放的方法

MineTestService

用来初始化相关的配置

1d6a8853fbfdbd29db7b4f01fb2f9150.png

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

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 = 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, 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

要引用类的包名+类名

fcb4275787f2a666968bc225a99c749a.png

二、配置和引用插件

接下来回到HBuilder中,对项目的manifest.json进行配置,将自定义的插件配置进来。配置插件如下图所示:

32fa2670d3b41f221358bdb33db96722.png

对主界面的代码修改一下,以使用插件的形式。来完成申请地理位置权限,并获取当前地理位置结果的功能。完整代码如下:

获取地理位置信息

9a4af9bebf3779b3ea1793a370e5b437.gif

前三章的链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值