最近有商户需要接入我们sdk,但是我们都是android或者ios原生的,直接用又不能用,需要做适配,本文就教你一步步实现android aar适配uniapp。
官方参考教程:开发者须知 | uni小程序SDK
但是官方写的比较繁琐,好像也没有写哪里去获取他们的扩展类的包,就是需要继承
io.dcloud.feature.uniapp.common.UniModule
这个类,你才能暴露出js的方法给uniapp使用。
第一步:获取需要继承的扩展类aar包
在这里
https://mvnrepository.com/artifact/io.dcloud.unimp/uni-app-v8/4.17.2024051110
如果不是这个地址了,你在https://mvnrepository.com搜索io.dcloud.unimp
在你的android项目里面添加如下依赖:
implementation group: 'io.dcloud.unimp', name: 'uni-app-v8', version: '4.17.2024051110'
或者下载后放在本地libs文件夹引入。
api(name: 'uni-app-v8-4.17.2024051110', ext: 'aar')
第二步:编写你需要开放给uniapp调用的方法
类必须继承自UniModule
UniJSMethod表示暴露出js方法
UniJSCallback表示回调函数,把结果回调给uniapp
package com.figo.test.uniapp;import android.app.Application;
import android.content.Intent;
import android.util.Log;import com.figo.test.activity.MainActivity;import org.json.JSONObject;import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
public class PayModule extends UniModule{String tag="PayModule";public static UniJSCallback callback;/**** @param env* @param orderInfo* @param callback*/@UniJSMethodpublic void testPay(String env,String orderInfo, UniJSCallback callback) {this.callback=callback;JSONObject jsonObject=new JSONObject();Log.i(tag, "unionPay orderInfo=" + orderInfo + ",mode=" + mode);//切记,必须通过这种方式获取context上下文,从uniapp传过来的,目前测试下来无法使用Application context=(Application) mUniSDKInstance.getContext().getApplicationContext();try {if (orderInfo == null || orderInfo == "") {callback.invoke("orderInfo 不能为null或者为空");return;}Log.i(tag, "startActivity");final Intent intent = new Intent(context, MainActivity.class);//必须加这个不然也调不起来aar中的activityintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("orderInfo", orderInfo);intent.putExtra("env", mode);context.startActivity(intent);}catch(Exception ex){ex.printStackTrace();Log.e(tag, ex.getMessage());try {jsonObject.put("respCode","9999");jsonObject.put("respMsg",ex.getMessage());jsonObject.put("orderInfo",orderInfo);callback.invoke(jsonObject.toString());} catch (Exception e) {e.printStackTrace();}}}@UniJSMethodpublic void add(int num1,int num2, UniJSCallback callback) {Log.i(tag,"num1="+num1+",num2="+num2);int sum=num1+num2;if (callback != null) {callback.invoke(sum);}}@UniJSMethodpublic void multiply(int num1,int num2, UniJSCallback callback) {Log.i(tag,"num1="+num1+",num2="+num2);int result=num1*num2;if (callback != null) {callback.invoke(result);}}
}
第三步:在assets文件夹新建dcloud_uniplugins.json文件
{"nativePlugins": [{"plugins": [{"type": "module","name": “test”,"class": "com.figo.test.uniapp.PayModule"}]}]
}
第四步:uniapp项目引用aar
把依赖放进nativeplugins文件夹
双击manifest.json添加依赖
第五步:uniapp调用android aar中的方法
<template><view class="content"><image class="logo" src="/static/logo.png"></image><view class="text-area"><text class="title">{{title}}</text></view><button type="button" @click="click">按钮</button></view>
</template><script>const test = uni.requireNativePlugin('test');export default {data() {return {title: 'Hello'}},onLoad() {},methods: {click(){//debuggerconsole.log(mobilepayment);mobilepayment.add(100,118,res => {console.log("add返回值="+res);})mobilepayment.multiply(2,9,res => {console.log("multipy返回值="+res);})if (uni.getSystemInfoSync().platform === 'android') {console.log("android调试开始");var orderInfo={"Version": "20240823","MerId": "1234567890","MerOrderNo": "2024082312345678","TranDate": "20240823","TranTime": "163026","OrderAmt": "1","Signature": "test123123123"
}const orderInfoString = JSON.stringify(orderInfo);test.testPay("00",orderInfoString,res => {console.log(res);})} else {console.log('此API只能在Android平台使用');}}}}
</script><style>.content {display: flex;flex-direction: column;align-items: center;justify-content: center;}.logo {height: 200rpx;width: 200rpx;margin-top: 200rpx;margin-left: auto;margin-right: auto;margin-bottom: 50rpx;}.text-area {display: flex;justify-content: center;}.title {font-size: 36rpx;color: #8f8f94;}
</style>
第六步:打包运行
android的需要运行到手机或者模拟器