Uniapp是一种跨平台开发工具,可以同时开发多种平台,包括Android和iOS。虽然Uniapp自身提供了很多原生插件,但是有时候我们需要自己开发一些定制化的原生插件。本文将介绍如何开发安卓原生插件。
一、原理
在Uniapp开发中,我们可以通过编写JS代码来实现封装原生模块,再通过调用封装模块中的接口来实现原生功能的调用。
而安卓原生插件的开发主要分为以下几个步骤:
1、编写Java类
2、生成aar包
3、在Uniapp中引入aar包
4、编写JS代码,调用Java类中的方法
二、详细介绍
1、编写Java类
首先我们需要编写一个Java类用于实现我们的插件功能。
以生成二维码为例,我们需要编写一个QRHelper类,类似如下:
```
package com.example.uniappqrhelper;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.util.HashMap;
import java.util.Map;
public class QRHelper {
public static Bitmap createQRImage(String content, int widthPix, int heightPix) {
Bitmap bitmap = null;
try {
//配置参数
Map
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//容错级别
hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);
//设置空白边距的宽度
hints.put(EncodeHintType.MARGIN, 0);
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
int[] pixels = new int[widthPix * heightPix];
// 下面这里按照二维码的算法,生成二维码的图片,一行一行地填充图片数据
for (int y = 0; y < heightPix; y++) {
for (int x = 0; x < widthPix; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * widthPix + x] = Color.BLACK;
} else {
pixels[y * widthPix + x] = Color.WHITE;
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
} catch (WriterException e) {
e.printStackTrace();
}
return bitmap;
}
}
```
此处我们使用了Zxing来生成二维码图片。
2、生成aar包
接下来我们需要将QRHelper类打包成aar包。
在gradle中添加如下代码:
```
task aar(type: com.android.build.gradle.tasks.PackageLibrary) {
description 'Assembles a AAR archive containing the jar and and the AndroidManifest'
destinationDir file("$rootDir/aar")
libraryVariants.all { variant ->
def name = variant.buildType.name
def newName
if (name.equals("release")) {
newName = "libUniAppQrHelper.aar"
} else {
newName = "libUniAppQrHelper-$name.aar"
}
outputFileName = newName
}
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.aar')) {
project.artifacts.add('archives', outputFile)
}
}
}
}
```
然后执行gradle中的命令aaraar即可生成对应的aar包。
```
gradlew aar
```
3、在Uniapp中引入aar包
将生成的aar包复制到uni-app的根目录下的unpackage/resource文件夹中。此时我们需要在uni-app项目中的HBuilderX中进行配置。
1. 打开项目,创建一个新的文件夹,并命名为libs
2. 右键新建一个文件夹,命名为jniLibs
3. 将之前生成的aar文件保存在libs文件夹下,此处放在 libs/jniLibs/armeabi-v7a/ 中
4、编写JS代码,调用Java类中的方法
在需要调用的地方我们可以编写如下JS代码:
```
const qr_helper = uni.requireNativePlugin('UniAppQrHelper');
qr_helper.createQRImage(content, widthPix, heightPix, function (response) {
console.log(response)
})
```
其中,qr_helper是我们在Uniapp中注册后的插件名称,createQRImage是对应的Java类中方法名,content、widthPix、heightPix为调用时传递的参数。
至此,我们已经完成了安卓原生插件的开发。