本文出自:https://blog.csdn.net/Hello_World_CFF/article/details/116235988
作为一个安卓小白,真的是皇天不负有心人啊,在我将近一周的折腾下(看看参考了多少链接就知道了),问会安卓的同学,问网上的热心人,终于被我给整得有点眉目了,我真的很难啊。。试过直接把原来的项目直接弄进来,把界面变成库,但是因为一开始就读不到assets下的文件,放弃,后面直接把app的内容移植到即将打包的内容里,经过不懈努力,今天居然成功了。太开心了。一点点摸索中,希望有好入手的东西,看到的朋友,多给指指明路!万分感谢。
此处以目前最新的3.1.9版本为例,需要对应版本的HBuilderX及官方提供的SDK
(需要以下文件,可关注文末微信公众号,发送:HyperLPR
,即可免费获取,若链接失效可联系客服
)
已有HBuilderX前端项目
<template>
<view class="content">
<view @tap="getImg">拍照</view>
<view>{{result}}</view>
</view>
</template>
<script>
//#ifdef APP-PLUS
import permission_app from "@/api/permission_app.js";
// #endif
export default {
data() {
return {
isAndroidOs: true, //假设是安卓
result: '',
}
},
onLoad() {
let that = this;
},
methods: {
getImg() {
//#ifdef APP-PLUS
this.appCamera();
// #endif
},
async appCamera() {
let that = this;
var cmr = plus.camera.getCamera(1);
var res = cmr.supportedImageResolutions[0];
var fmt = cmr.supportedImageFormats[0];
let funTips = '相机';
var iscan = await permission_app.req_Permit_any(that.isAndroidOs, permission_app.permisionID_anrd
.camera,
permission_app.permisionID_ios.camera, funTips);
if (iscan) {
if (that.isAndroidOs) {
try {
var _act = plus.android.runtimeMainActivity();
plus.android.invoke("AndroidBridge", "doScan", _act);
_act.onActivityResult = function(requestCode, resultCode, data) {
console.log('requestCode' + JSON.stringify(requestCode));
plus.android.importClass(data);
var bundle = data.getExtras();
plus.android.importClass(bundle);
var plateInfo = bundle.getString("plateInfo");
var plate_obj = JSON.parse(plateInfo);
that.result = plate_obj.plateName;
}
} catch (err) {
console.log(JSON.stringify(err));
}
}
}
},
}
}
</script>
<style>
</style>
var _act = plus.android.runtimeMainActivity();
plus.android.invoke("AndroidBridge", "doScan", _act);
_act.onActivityResult = function(requestCode, resultCode, data) {
console.log('requestCode' + JSON.stringify(requestCode));
plus.android.importClass(data);
var bundle = data.getExtras();
plus.android.importClass(bundle);
var plateInfo = bundle.getString("plateInfo");
var plate_obj = JSON.parse(plateInfo);
that.result = plate_obj.plateName;
以上代码表示:在原生的安卓项目会新建一个 AndroidBridge类
,里面有一个 函数doScan
,会从 原生的Activity
返回结果, plate_obj.plateName
就是具体 识别出来的车牌
uni-app项目代码链接
替换Android Studio项目的www文件,并修改manifest.json
的id
__UNI__AB47F19
已有包名:com.test.aytestcc
已有证书:aytestcc.keystore
在此献上证书生成命令:
keytool -genkey -alias aytestccalias -keyalg RSA -keysize 2048 -validity 36500 -keystore aytestcc.keystore
原生项目按HyperLPR的安卓示例,添加Activity
com.test.aytestcc
在包名下添加MainActivity、CameraActivity
MainActivity
CameraActivity
import com.test.aytestcc.MainActivity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.json.JSONArray;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
public class AndroidBridge extends StandardFeature {
/**
* 识别方法
* @param activity
*/
public static void doScan(Activity activity) {
Log.i("TAG2-*--","doScan");
Intent intent = new Intent(activity, MainActivity.class);
activity.startActivityForResult(intent, 1);
}
}
1.2:B站视频链接
1.2:西瓜视频链接
把示例HyperLPR的安卓项目下的文件夹openCVLibrary342,移到新项目的同级目录下
把示例HyperLPR的安卓项目下的文件夹app\src\main下的cpp,移到新项目的同级目录下
在新项目的\src\main\assets文件夹新建pr文件夹,把示例HyperLPR的Linux项目下hyperlpr\model的所有文件,复制到新项目的src\main\assets\pr目录下
把示例HyperLPR的安卓项目下的文件夹app的CMakeLists.txt,移到新项目的同级目录下
把已生成好的证书aytestcc.keystore,放在simpleDemo目录下
(若不知道生成证书,请评论,看到后会出视频)
根据新项目的build.gradle的下面字段,把库文件openCVLibrary342的build.gradle修改成一样的
compileSdkVersion 29
buildToolsVersion "29.0.2"
simpleDemo的build.gradle要将HyperLPR的安卓项目下的文件夹app的build.gradle,进行对比,把少的部分都加上
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
// cppFlags "-std=c++11 -frtti -fexceptions"
// abiFilters 'armeabi-v7a'
arguments '-DANDROID_STL=gnustl_static'
// arguments '-DANDROID_STL=gnustl_shared'
// '-DANDROID_ABI=armeabi-v7a'
}
}
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
// abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
abiFilters 'armeabi-v7a'
}
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
jniLibs.srcDirs = ['libs','src/main/cpp/opencv342/sdk/native/libs']
//jniLibs.srcDirs =['src/main/libs','src/main/jniLibs']
}
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
implementation project(':openCVLibrary342')
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'android.arch.navigation:navigation-fragment:1.0.0'
implementation 'android.arch.navigation:navigation-ui:1.0.0'
implementation 'org.greenrobot:eventbus:3.0.0'
lintOptions {
checkReleaseBuilds false
abortOnError false
}
针对报错:
Errors while building APK. You can find the errors in the 'Messages' view
applicationId "com.test.aytestcc"
signingConfigs {
config {
keyAlias 'aytestccalias'
keyPassword '123456'
storeFile file('aytestcc.keystore')
storePassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
}
keyAlias 与storeFile file与生成证书的命令相对应
buildTypes {
debug {
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
package="com.test.aytestcc"
android:versionCode="1"
android:versionName="1.0"
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<provider
android:name="io.dcloud.common.util.DCloud_FileProvider"
android:authorities="com.test.aytestcc.dc.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/dcloud_file_provider" />
</provider>
添加库文件
include ':openCVLibrary342'
ndk.dir=D\:\\adrdsdk\\android-sdk-windows\\ndk\\16.1.4479499
sdk.dir=D\:\\adrdsdk\\android-sdk-windows
cmake.dir=D\:\\adrdsdk\\android-sdk-windows\\cmake\\3.10.2.4988404
此处的版本号,对应自动安装的版本号,可在安装目录,相应查看
1.4:B站视频链接
1.4:西瓜视频链接
把示例HyperLPR的安卓项目下的文件夹app\src\main\java下的CameraPreviews.java、PlateInfo.java、PlateRecognition.java文件,拷贝到package:com.test.aytestcc目录下(该目录下已有新建MainActivity.java和CameraActivity.java)
修改包名为com.test.aytestcc
com.test.aytestcc
//mPaint.setColor(ContextCompat.getColor(context, R.color.colorAccent));
除保留包名为com.test.aytestcc,其余全部复制粘贴
把中间内容全部复制粘贴,另外activity_camera.xml的主树修改成 LinearLayout,不然会报错
LinearLayout
1.5:B站视频链接
1.5:西瓜视频链接
修改新项目cpp下的javaWarpper.cpp文件,这一步尤为重要,不然PlateRecognition.java下是报错的,具体原因本人才疏学浅,只知道乱改。。
将原有函数名的pr_platerecognization
换成com_test_aytestcc
(根据自己包名替换),
com_test_aytestcc
将原有pr/platerecognization
,换成com/test/aytestcc
(根据自己包名替换)
com/test/aytestcc
这个也是我突发奇想试着改了的,哈哈,好在对了
不报错,就可以选择手机(手机已设置开发者模式),点运行,然后点拍照,对准一个有车牌图片的图片,就能有示例运行效果。
至此,新项目整合车牌识别终于告一段落,后面还有把车牌传回到uniapp里面做相应处理,还需对示例代码做变更,后面文章继续分享,若您遇到什么问题,欢迎联系。这些若没有好友及热心网友回复,百度几天也一定不会有结果,真开心受过几天折磨后,终于有点效果,希望本篇文章,能帮助正在困惑的你,有问题,欢迎指正。
1.7:B站视频链接
1.7:西瓜视频链接
B站
西瓜视频
package com.test.aytestcc;
import android.content.Context;
import io.dcloud.application.DCloudApplication;
public class identifyApplication extends DCloudApplication {
public static Context app ;
@Override
public void onCreate() {
super.onCreate();
app = getApplicationContext() ;
return;
}
}
application节点上添加
android:name=".identifyApplication"
tools:replace="android:name"
android:requestLegacyExternalStorage="true"
新建identifyApplication类后面没用得了,适用于不用返回函数的Activity的调用,对应调用代码为:
(二)Android Studio uniapp新项目集成HyperLPR开源项目
Android Studio 运行HyperLPR开源项目安卓APP
Xcode 运行HyperLPR开源项目苹果APP
微信小程序联系客服,及时沟通
扫描公众号,了解更多实例与资源免费分享:
Errors while building APK. You can find the errors in the ‘Messages’ view
uni-app 跳转Android原生界面(Activity),并传值交互
使用JS调用安卓原生Activity并获取返回结果
移动端车牌识别OCR-结合OpenCV
java.io.FileNotFoundException: /storage/emulated/0/xxx.mp3: open failed: EACCES (Permission denied)
Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xaf3e40ce in tid 24827 (parking.manager), pid 24827 (parking.manager)
Android和uniapp互传数据
Android 发出警告 android.useDeprecatedNdk 不在被支持
Android Studio 3.0 Jni 开发环境配置 ndk cmake编译 多个C/C++文件添加配置
cmake需要更高
Android Studio引用另一个模块module的方法
遇见BUG之 “Dependent features configured but no package ID was set”
Manifest merger failed with multiple errors, see logs
Execution failed for task ':app:process_DebugManifest
模块间如何通信
android多模块依赖传递
AndroidStudio NDK之使用OpenCV
Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager
opencv
opencv doc
Android studio 一个项目引入另一个项目作为Libary
java.lang.UnsatisfiedLinkErro
android studio怎么把一个项目中的module移到另一个项目中使用
Android OpenCV集成摄像头图片动态识别车牌号
uniapp原生安卓插件开发之路
5+App IOS平台第三方插件开发指导
uni-app原生插件(native plugin)开发指南
UNIAPP 混合开发 JS调用JAVA代码(ANDROID代码
uniapp中前端如何和原生混合开发开发app
原生插件开发官网
uniapp和Android原生数据交互
码云代码链接