您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
uniapp调用原生安卓方法(原生端安卓端noActivity)
发布时间:2023-12-10 23:49:51编辑:雪饮阅读()
-
获取sdk
- 如D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\ build.gradle文件中的applicationId配置值
- 如D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\src\main\ AndroidManifest.xml中的manifest标签的package值。
使用uniapp调用原生安卓的一些接口,实在是无奈之举,本次的需求也是不需要原生界面的,也就是no activity。
首先是我的androidstudio的版本信息
Android Studio Giraffe | 2022.3.1 Patch 2
可能有点旧,几乎半年没有更新了。
然后到uniapp官方提供的一个离线sdk下载这个离线sdk
https://nativesupport.dcloud.net.cn/AppDocs/download/android.html#
解压后目录结构如
latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS
这个结构是UniPlugin-Hello-AS的sdk,好像还有其它sdk。
导入sdk
接下来在android studio中File=》New=>Import Project选择到latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS
这个目录
解决Gradle依赖
导入过程中比较慢,特别是首个依赖Gradle.如果,以前稍微接触过一点原生安卓开发,有时候可能还需要不断的重新加载这个Gradle,这就很致命。而这个Gradle默认是是通过http请求得到。
那么也可以手动配置,示例如下:
配置文件路径如:
C:\Users\Administrator\AndroidStudioProjects\MyStart\gradle\wrapper\gradle-wrapper.properties
配置示例
联网下载版示例(默认)
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
本地版示例
distributionUrl=file:///D:/androidStudio/gradle-8.0-bin.zip
处理错误Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed
好不容易各种依赖都ok了,build结果显示:Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed;
在build控制台错误结果栈展开一个Unsupported Java的项目,可以发现:
Unsupported Java.
Your build is currently configured to use Java 17.0.6 and Gradle 6.5.
Possible solution:
- Upgrade Gradle wnapper to 7.2 vension and re-import the project
这里是uniapp这个sdk不能在太高的jdk上运行,官方目前推荐是jdk1.8
。
点击UniPlugin-Hello-AS项目上右键Open Module Settings在新的界面中Project Settings=》Project=》Sdk
这里可以看到默认选中的是jdb-17,在这个下拉里面新增jdk1.8(前提你需要安装jdk1.8并记得你安装的路径,并且要配置好环境变量,path变量里面需要包含到bin目录,也就是cmd中能java –version看到是jdk1.8,另外JAVA_HOME的系统级别环境变量也需要配置到bin所在目录(非bin目录),例如C:\Program Files\Java\jdk-1.8
)
cmd效果如:
C:\Users\Administrator>java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)
重启android studio(最好是在File=>Invalidate Caches…进行重启(可能会导致重新下载gradle,记不太清了,不管怎样,前面手动配置gradle为本地路径总是好的))。
如果还是没有生效。
仍旧是java17.。。这里也保存下。
在File=》Settings=》Build,Execution,Deployment=>Gradle=>Gradle projects这里看到当前项目名称UniPlugin-Hello-AS,在其右边Gradle JDK这里下拉也选择到自己安装的jdk1.8.
成功build构建,那么上面的问题就处理完成了。
创建hbuild项目并生成本地打包资源
创建hbuild项目,项目类型就选择uniapp就行。
发行=》原生app本地打包=》生成本地打包app资源
这里可能需要提示你下载一个云打包插件,下载后再次尝试打包又提示你需要appid,可以在manifest.json以视图模式打开时候重新获取。由于是新项目,这里没有考虑那么多,对于他重新获取的哪些所谓的危害。(看了下,基本上我都用不到,都是些unipush、一键登录等)。
控制台中打包成功会输出如
导出成功,路径为:C:/Users/Administrator/Documents/HBuilderProjects/testys/unpackage/resources/__UNI__61C55E3/www
[HBuilder] 22:18:09.490 提示:本wgt文件由HBuilderX 3.95版本生成,运行的基座sdk也需配套相同版本,否则在手机端部分功能可能无法正常使用。详见 https://ask.dcloud.net.cn/article/35627
这里需要注意这个提示
[HBuilder] 22:18:09.490 提示:本wgt文件由HBuilderX 3.95版本生成,运行的基座sdk也需配套相同版本,否则在手机端部分功能可能无法正常使用。
可能会有所影响,实际上我用的sdk是3.98,暂时发现影响不是特别大。
uniapp项目导入到android studio
上面生成的包路径中有个__UNI__61C55E3,这个是你的appid。
将这个appid配置到如:
D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\src\main\assets\data\dcloud_control.xml中的appid
配置后如:
<hbuilder>
<apps>
<app appid="__UNI__61C55E3" appver=""/>
</apps>
</hbuilder>
同样的,在路径如:
D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\src\main\assets\apps下的第一个目录,也仅这一个目录的名称也修改为以你的appid命名的目录名称。
然后将刚才uniapp生成的打包资源路径如
C:/Users/Administrator/Documents/HBuilderProjects/testys/unpackage/resources/__UNI__61C55E3/www
这个www目录中的文件全部覆盖到上面你修改了目录名称的这个目录中的www目录中去。
生成及配置Appkey(dcloud_appkey)/”appid”
接下来需要登录到uniapp开发者中心,找到你这个appid对应的应用,点开应用名称进入应用详情页面在“各平台信息”是一个列表,默认是空列表,点击右边的新增出现的界面里面
首先要选择正式版或者测试版。
我个人认为这里的版本应该是和android studio生成key时候的release/debug是关联的,根据目前我的情况,我又不是上线到google play商店,我就选择了测试版。
接下来需要填写包名,这个包名是同步下面几个地方的配置:
再下来就是需要签名sha1值
在android studio工具栏build=》Generate Signed Bundle / Apk…
这里可以生成签名,就是输入下密码,和签名文件存储路径,密码是你自己定义,你记住即可,后面需要用到,存储路径也需要记得,也需要用到。
最后的签名类型我这里就是同步上面的正式/测试,由于上面选择的是测试,所以我这里签名类型是debug。
接下来比如我生成的签名文件路径如C:\Users\Administrator\yuanshengchajiankey\test.jks
而我的jdk1.8的bin路径如:C:\Program Files\Java\jdk-1.8\bin
那么我这里执行如下命令后输入刚才设置的签名密码
C:\Users\Administrator\yuanshengchajiankey>cd C:\Program Files\Java\jdk-1.8\bin
C:\Program Files\Java\jdk-1.8\bin>keytool.exe -list -v -keystore C:\Users\Administrator\yuanshengchajiankey\test.jks
就可以看到如下信息:
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SunJSSE
您的密钥库包含 1 个条目
别名: key0
创建日期: 2023-12-10
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=xy, ST=xy, L=xy, O=xy, OU=xy, CN=xy
发布者: C=xy, ST=xy, L=xy, O=xy, OU=xy, CN=xy
序列号: 1
生效时间: Sun Dec 10 20:54:24 CST 2023, 失效时间: Thu Dec 03 20:54:24 CST 2048
证书指纹:
SHA1: C1:7C:14:DB:56:C5:88:E6:2A:38:BB:62:C9:D6:52:7A:4A:9C:99:67
SHA256: E8:A8:26:4A:7E:AA:20:9E:1A:4D:8D:C9:66:09:08:EF:D9:EE:8C:AA:9E:CF:E5:98:1B:E3:F3:D7:8B:E1:D4:58
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
*******************************************
将这些信息对应填写到刚才那个需要sha1签名值和sha256签名值的地方提交。
提交后在各平台信息列表就多了一个项目,该项目的字段离线打包Key点击下就可以创建一个key,这个key就是Appkey(dcloud_appkey/”appid”)
然后配置这个Appkey,首先是将刚才生成的签名文件复制以覆盖路径如
D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\ test.jks
这个文件。
然后配置路径如D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\ build.gradle这个文件中如下配置配置为你刚才创建签名时候填写的即可
signingConfigs { config { keyAlias 'key0' keyPassword '123456' storeFile file('test.jks') storePassword '123456' v1SigningEnabled true v2SigningEnabled true } }然后配置路径如D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\src\main\ AndroidManifest.xml中的
<meta-data android:name="dcloud_appkey" android:value="这里填写你刚才创建的Appkey" />
uniapp中调用android studio项目中的原生方法
重新回到uniapp上面,我们在路径如
C:\Users\Administrator\Documents\HBuilderProjects\testys\pages\index\index.vue
修改这个默认的index.vue页面后如:
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
</view>
</template>
<script>
const pluginImpl = uni.requireNativePlugin('TestModule')
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
var data=pluginImpl.testSyncFunc();
this.title=data.code;
},
methods: {
}
}
</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>
这里比较重要的是
const pluginImpl = uni.requireNativePlugin('TestModule')
这里为什么是TestModule
因为在路径如D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\app\src\main\assets\ dcloud_uniplugins.json中配置如:
{ "nativePlugins": [ { "plugins": [ { "type": "module", "name": "TestModule", "class": "io.dcloud.uniplugin.TestModule" } ] }, { "plugins": [ { "type": "component", "name": "myText", "class": "io.dcloud.uniplugin.TestText" } ] }, { "hooksClass": "", "plugins": [ { "type": "module", "name": "DCloud-RichAlert", "class": "uni.dcloud.io.uniplugin_richalert.RichAlertModule" } ] } ] }这其中的第一项配置
{
"plugins": [
{
"type": "module",
"name": "TestModule",
"class": "io.dcloud.uniplugin.TestModule"
}
]
}
这里的name就是TestModule。
而路径如
D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS这里正好分别有三个UniPlugin,分别是
uniplugin_component
uniplugin_module
uniplugin_richalert
而其中uniplugin_module中如:
D:\BaiduNetdiskDownload\latest\3.98\Android-SDK@3.98.81972_20231127\Android-SDK@3.98.81972_20231127\UniPlugin-Hello-AS\uniplugin_module\src\main\java\io\dcloud\uniplugin\ TestModule.java中类如:
package io.dcloud.uniplugin; import android.app.Activity; import android.content.Intent; import android.util.Log; 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; public class TestModule extends UniModule { String TAG = "TestModule"; public static int REQUEST_CODE = 1000; //run ui thread @UniJSMethod(uiThread = true) public void testAsyncFunc(JSONObject options, UniJSCallback callback) { Log.e(TAG, "testAsyncFunc--"+options); if(callback != null) { JSONObject data = new JSONObject(); data.put("code", "success"); callback.invoke(data); //callback.invokeAndKeepAlive(data); } } //run JS thread @UniJSMethod (uiThread = false) public JSONObject testSyncFunc(){ JSONObject data = new JSONObject(); data.put("code", "success"); return data; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUEST_CODE && data.hasExtra("respond")) { Log.e("TestModule", "原生页面返回----"+data.getStringExtra("respond")); } else { super.onActivityResult(requestCode, resultCode, data); } } @UniJSMethod (uiThread = true) public void gotoNativePage(){ if(mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) { Intent intent = new Intent(mUniSDKInstance.getContext(), NativePageActivity.class); ((Activity)mUniSDKInstance.getContext()).startActivityForResult(intent, REQUEST_CODE); } } }这里可以看到有分为运行在ui线程和js线程的方法,那么我主要是不想带ui的,就是和先前一开始的期望一样,结合该js线程方法的实现以及该类名为TestModule。那么所以我uniapp中上面的index.vue中我调用了const pluginImpl = uni.requireNativePlugin('TestModule')
以及后面的var data=pluginImpl.testSyncFunc();
this.title=data.code;
那么最后将这个uniapp重新生成本地app打包资源并重新导入到android studio中上面提及的www目录中后。运行到手机中可以看到我们原生方法中的json结果中的success被成功输出了在uniapp的页面中了。而不是默认的Hello了。
关键字词:uniapp,原生,android,安卓
相关文章
- uniapp实现语音识别(百度语音识别引擎)(粤语)
- uniapp利用canvas绘制阿姆斯勒量表测试(用户点选线条
- uniapp的ios模拟器调试(无需ios真机及mac电脑)
- HBuilder X的uniapp项目运行到ios模拟器(ios16.4)(无
- uniapp中处理从webview中支付同步回调到app中
- 安卓okhttp发送json与解析json(支持嵌套)
- uniapp系列之webview加载html 动态创建webview 非url
- CMake Error錯誤(add_library)Cannot find source fil
- 安卓camera2使用ffmpeg進行對rtmp服務器推流的實現
- 解決camera2使用ImageReader預覽時出現卡頓情況