引言
最近正好闲着没事,试了下uniapp
(aar方式)与原生安卓
(kotlin)进行通信,官方文档众所周知一如既往的烂,所有这中间也踩了不少坑,然后功能实现的是uniapp nfc读取卡id,因为我没有公交卡和门禁卡,加上身份证和银行卡有加密,暂时就拿id吧,内容暂时就分uniapp和原生安卓两个模块进行介绍。因为我对原生也不是太熟悉,所以写的不对的地方望指正
安卓原生
创建安卓module
需要先创建安卓项目,然后才能创建module


下载uniapp-v8-release.aar
这个aar就是uniapp官方开的与安卓桥接的库,下载地址我放在文章底部了
项目目录结构
将下载的uniapp-v8-release.aar放到如下图片所在位置,然后修改build.gradle.kts文件

build.gradle.kts
dependencies { compileOnly(fileTree("./libs") { include("uniapp-v8-release.aar") }) }
|
main.kt
import android.app.Activity import android.content.Context import android.nfc.NfcAdapter
import io.dcloud.feature.uniapp.annotation.UniJSMethod import io.dcloud.feature.uniapp.common.UniModule
class NfcDataReader : UniModule() { @UniJSMethod(uiThread = true) fun startListening(callback: (tagId: String) -> Unit) { val ctx = mUniSDKInstance?.context as Context NfcAdapter.getDefaultAdapter(ctx)?.enableReaderMode( ctx as Activity, { tag -> callback(tag.id.joinToString("") { "%02X".format(it) }) }, NfcAdapter.FLAG_READER_NFC_A, null ) }
@UniJSMethod(uiThread = true) fun stopListening() { val ctx = mUniSDKInstance?.context as Context ctx.let { activity -> NfcAdapter.getDefaultAdapter(activity)?.disableReaderMode(ctx as Activity) } } }
|
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.NFC" /> </manifest>
|
打包aar
在项目根目录
运行如下命令,打包后的aar在如下位置,该文件后续有用
./gradlew nfc:assembleRelease
|

UniApp
项目目录
注意: 主文件夹必须叫nativeplugins,然后调用自定义插件必须打自定义基座

package.json
{ "name": "nfc插件", "version": "1.0.0", "id": "nfc", "_dp_type":"nativeplugin", "_dp_nativeplugin":{ "android": { "plugins": [{ "type": "module", "name": "nfc", "class": "NfcDataReader" }], "integrateType": "aar" } } }
|
打自定义基座
运行->运行到手机或模拟器->制作自定义调试基座,这儿必须使用传统打包,反正我试了下快速安心打包好像不行,打好了把这个apk装到手机上即可

uniapp调用
const nfc = uni.requireNativePlugin('nfc') nfc.startListening(({tagId}) => console.log(`nfc识别码: ${tagId}`))
|
使用本地基座运行项目

代码片段
实现消息通知
package com.omi.nfc
import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import android.content.Context.NOTIFICATION_SERVICE import android.content.Intent import android.provider.Settings import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import io.dcloud.feature.uniapp.annotation.UniJSMethod import io.dcloud.feature.uniapp.common.UniModule
class UniNotify: UniModule() {
@UniJSMethod(uiThread = true) fun reqNotify(title: String, text: String) { val ctx = mUniSDKInstance?.context as Context val isEnabled = NotificationManagerCompat.from(ctx).areNotificationsEnabled() if (!isEnabled) { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, ctx.packageName) } ctx.startActivity(intent) } else { val mChannel = NotificationChannel("notification", "所有通知", NotificationManager.IMPORTANCE_DEFAULT) val notificationManager = ctx.getSystemService(NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(mChannel) val notification = NotificationCompat.Builder(ctx, "notification") .setSmallIcon(R.drawable.ic_notification) .setContentTitle(title) .setContentText(text) .setPriority(NotificationCompat.PRIORITY_DEFAULT) .build() notificationManager.notify(1001, notification) } } }
|
uniapp安卓插件开发教程
android nfc基础知识
aar包下载地址