Uniapp和原生sayhello交互
把uniapp的resources代码导出给安卓使用
HBuilderX(写uniapp代码)
下载HBuilderX稳定版(与上述原文发布时候的不大一样了) https://www.dcloud.io/hbuilderx.html
我下载的是 3.7.8.20230323 版本
用HBuilderX新建项目,选择默认模版即可
更改
pages/index/index.vue
内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<button type="default" @click="sayhello">调用原生方法-异步回调(调用的方法名sayhello与安卓中的方法名一致)</button>
</view>
</template>
<script>
const myModule = uni.requireNativePlugin('MyModule') //MyModule与Android中建的插件名一致
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
},
methods: {
sayhello() {
myModule.sayhello({ //这是给安卓方法传参,并toast回调的内容
'name': '张三',
'age': 20,
'words': "你好!"
}, (ret) => {
uni.showToast({
title: ret
})
})
},
},
}
</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>生成本地打包app资源备用
工具栏:发行》原生App-本地打包(L)》生成本地打包App资源(R)
生成的内容在
unpackage/resources/
文件夹下,这个文件夹下的内容等下要复制到 AndroidStudio 中使用这个步骤会要求填写 appid(uniapp唯一码),有链接可以跳到 DCloud 平台
在DCloud平台进行注册
在开发者中心,点击刚刚生成的应用的名称。
点“Android云端证书”,生成证书。这个证书下载下来【就是Android那边的 jks 签名文件。等下复制到Android项目app目录下】
本地命令行窗口:使用 keytool 命令查看 SHA1、SHA256
1
keytool -v -list -keystore 下载下来的keystore的绝对路径
把 SHA1、SHA256填写到 开发者中心》各平台信息,点提交之后,可以查看“离线打包key”【等下复制到 Android 项目的
AndroidManifest.xml
中替换dcloud_appkey
的value值】
Android项目
下载官方demo :
2023年03月23日发布——HBuilderX(3.7.8.20230323)解压后,用Android Studio打开
UniPlugin-Hello-AS
项目创建自己的module
在刚创建的module的
build.gradle
中的dependencies
内添加1
2
3
4
5
6
7compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])
compileOnly 'androidx.recyclerview:recyclerview:1.0.0'
compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'
compileOnly 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.alibaba:fastjson:1.1.46.android'
implementation 'com.facebook.fresco:fresco:1.13.0'在
app/build.gradle
中的dependencies
内添加implementation project(':mylibrary')
把
app/src/main/assets/apps
下的__UNIX_E_
删除,把HbuilderX生成的本地资源(HBuilderX项目下unpackage/resources/
文件夹下的内容)复制进来app/src/main/assets/data/dcloud_control.xml
文件修改 appid(__UNI__7F90CC3
),跟复制到app/src/main/assets/apps
的名称一致写Andorid代码,供uniapp调用【注意名称】
在我们刚创建的module中写代码【
mylibrary/src/main/java/com.ab.mylibrary
下新建MyModule类】:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package com.ab.mylibrary;
import android.util.Log;
import android.widget.Toast;
import com.alibaba.fastjson.JSONObject;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
/**
* desc :
* author : shenbh
* time : 2023-3-27 08:49
*/
public class MyModule extends UniModule {
private static final String TAG ="MyModule";
public void sayhello(JSONObject options, UniJSCallback callback){
Log.e(TAG, "testAsyncFunc--" + options);
if (callback != null) {
String name =options.getString("name");
Toast.makeText(mUniSDKInstance.getContext(), name, Toast.LENGTH_SHORT).show();
JSONObject data = new JSONObject();
data.put("code", "success");
data.put("message", "我是李四");
callback.invoke(data);
// callback.invokeAndKeepAlive(data);
}
}
}app/src/main/assets/dcloud_uniplugins.json
文件中添加我们创建的module
把Android项目弄成插件给uniapp调用
接上述的 Uniapp和原生sayhello交互
AS打包生成原生插件aar
AS右侧Gradle》自己创建的module下的other》bundleReleaseAar。双击进行aar发行版打包
生成在
自己创建的module下build/outputs/aar
路径下HBuilderX引入aar
HBuilderX选择本地插件
制作自定义调试基座
注意:如果出现已经制作自定义调试基座,但是没有运行基座选择这一选项的情况。请重新进行自定义基座打包,直到出现运行基座选择为止!
注意!!!
- uniapp测试aar包的时候,每次变动aar包内容都要重新云打包!!!再用自定义调试基座运行
- uniapp云打包要求只能有一个aar包
代码(原生插件)
方法调用
问题
app运行后,未配置appkey或配置错误
解决:
app/src/main/AndroidManifest.xml中,替换成具体的值
1
2
3<meta-data
android:name="dcloud_appkey"
android:value="4201732dc35d8c819f0556c7ea9e0dd9" />app/src/main/assets/:替换apps的内容,修改
data/dcloud_control.xml
的appid值,修改dcloud_uniplugins.json
内容更改keystore,更改成跟appid相对应得(在dcloud官网申请的keystore)
更改
app/build.gradle
的config内容注意:keystore、applicationId、appid都要对应上