最近有商户需要接入我们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
java
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
*/
@UniJSMethod
public 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中的activity
intent.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();
}
}
}
@UniJSMethod
public 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);
}
}
@UniJSMethod
public 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文件
javascript
{
"nativePlugins": [
{
"plugins": [
{
"type": "module",
"name": "test",
"class": "com.figo.test.uniapp.PayModule"
}
]
}
]
}
第四步:uniapp项目引用aar
把依赖放进nativeplugins文件夹
双击manifest.json添加依赖
第五步:uniapp调用android aar中的方法
javascript
<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(){
//debugger
console.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的需要运行到手机或者模拟器