本文简单介绍使用as写一个简单的自定义apicloud模块(其中的示例是一个获取蓝牙地址的demo).
首先看一下目录结构:
红色方块内的是需要编写的,首先新建项目并添加一个module(Android Library类型)并添加依赖,新建一个任意名称Java文件写插件,module内存放的是java类的路径和调用的js名称(在我看来就是模块名称).
先看java文件:
/**
* Created by th2 on 2017/8/15.
* 本地蓝牙地址
*/
public class LocalBlueAddressDemo extends UZModule{
public LocalBlueAddressDemo(UZWebView webView) {
super(webView);
}
public void jsmethod_localBlueAddress(final UZModuleContext moduleContext){
JSONObject json = new JSONObject();
try {
json.put("blueaddress",getBtAddressViaReflection());
} catch (JSONException e) {
e.printStackTrace();
}
moduleContext.success(json,true);
}
private String getBtAddressViaReflection() {
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Object bluetoothManagerService = new Mirror().on(bluetoothAdapter).get().field("mService");
if (bluetoothManagerService == null) {
Log.w("TAG", "couldn't find bluetoothManagerService");
return null;
}
Object address = new Mirror().on(bluetoothManagerService).invoke().method("getAddress").withoutArgs();
if (address != null && address instanceof String) {
Log.w("TAG", "using reflection to get the BT MAC address: " + address);
return (String) address;
} else {
return null;
}
}
}
首先这个类必须继承UZModule并且方法名必须是jsmethod_方法名,如果不是上述类型是检测不到你的方法的,在其中你可以使用moduleContext.success()使用成功回调,这里是一个简单的获取蓝牙地址的方法.
然后看module.json:
{
name:'taihuaBlueDemo',
class:'com.example.bluelibrary.LocalBlueAddressDemo'
}
其中name就是插件的名称,class就是java的路径(包名+类名),注意,这里有个坑是不能按照官方的demo那样写成中括号类型的.然后rebuild一下项目(前提是你已经在项目中添加了依赖).
然后你会在bluelibrary>build>intermediates>bundles>release文件下找到一个classes.jar的文件,这个文件就是你生成的jar(当然可以改成任意名称).
然后你需要创建一个文件夹用来存放模块,其中文件夹名称就是模块名称.下面是文件夹目录结构:
res_blueDemo用来存放你的资源文件和AndroidManifest.xml,source里面存放你刚才获得的jar文件.然后将整个文件压缩.然后只要上传就可以了
js的调用时:
var demo = api.require('*******');
demo.localBlueAddress(function (ret, err) {
});
****就是模块的名字,localBlueAddress是方法的名称.
划重点!!!!!!!其中遇到的一个大坑,在我的插件中我使用的三方的依赖,导致我每次调用的时候都是报错.
比如说我在获取蓝牙地址的时候使用了mirror-1.6.1.jar这个文件,只需要下载它的jar文件再将它加入到source文件中就可以了,天啊撸,浪费了我好长的时间.