Android Studio uniapp新项目集成HyperLPR开源项目(一)

Android Studio uniapp新项目集成HyperLPR开源项目(一)

本文出自:https://blog.csdn.net/Hello_World_CFF/article/details/116235988

前提:已安装并配置Android Studio、HBuilderX

作为一个安卓小白,真的是皇天不负有心人啊,在我将近一周的折腾下(看看参考了多少链接就知道了),问会安卓的同学,问网上的热心人,终于被我给整得有点眉目了,我真的很难啊。。试过直接把原来的项目直接弄进来,把界面变成库,但是因为一开始就读不到assets下的文件,放弃,后面直接把app的内容移植到即将打包的内容里,经过不懈努力,今天居然成功了。太开心了。一点点摸索中,希望有好入手的东西,看到的朋友,多给指指明路!万分感谢。

一、下载文件

此处以目前最新的3.1.9版本为例,需要对应版本的HBuilderX及官方提供的SDK
(需要以下文件,可关注文末微信公众号,发送:HyperLPR,即可免费获取,若链接失效可联系客服
配置sdk所在的目录(ndk据项目配置)

二、解压文件

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第1张图片

三、HBuilderX打开项目,添加代码,并生成打包

前提

已有HBuilderX前端项目

示例项目结构

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第2张图片

index.vue代码

<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 uniapp新项目集成HyperLPR开源项目(一)_第3张图片

四、Android Studio打开项目

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第4张图片

五、替换www文件,并修改manifest.json

替换Android Studio项目的www文件,并修改manifest.jsonid

__UNI__AB47F19

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第5张图片
1.1:B站视频链接
1.1:西瓜视频链接

六、Android Studio项目代码修改

前提

已有包名:com.test.aytestcc
已有证书:aytestcc.keystore

在此献上证书生成命令:

keytool -genkey -alias aytestccalias -keyalg RSA -keysize 2048 -validity 36500 -keystore aytestcc.keystore

原生项目添加Activity

原生项目按HyperLPR的安卓示例,添加Activity

新建package:com.test.aytestcc

com.test.aytestcc

新建Activity

在包名下添加MainActivity、CameraActivity

MainActivity
CameraActivity

原生项目添加AndroidBridge类

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:西瓜视频链接

添加文件

文件夹openCVLibrary342

把示例HyperLPR的安卓项目下的文件夹openCVLibrary342,移到新项目的同级目录下

文件夹cpp

把示例HyperLPR的安卓项目下的文件夹app\src\main下的cpp,移到新项目的同级目录下

新建pr文件夹,并移动模型文件

在新项目的\src\main\assets文件夹新建pr文件夹,把示例HyperLPR的Linux项目下hyperlpr\model的所有文件,复制到新项目的src\main\assets\pr目录下

CMakeLists.txt

把示例HyperLPR的安卓项目下的文件夹app的CMakeLists.txt,移到新项目的同级目录下

证书放在simpleDemo目录下

把已生成好的证书aytestcc.keystore,放在simpleDemo目录下
(若不知道生成证书,请评论,看到后会出视频)

安装NDK和cmake

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第6张图片
1.3:B站视频链接
1.3:西瓜视频链接

修改配置文件

openCVLibrary342的build.gradle

根据新项目的build.gradle的下面字段,把库文件openCVLibrary342的build.gradle修改成一样的

	compileSdkVersion 29
    buildToolsVersion "29.0.2"

simpleDemo的build.gradle

simpleDemo的build.gradle要将HyperLPR的安卓项目下的文件夹app的build.gradle,进行对比,把少的部分都加上

补app的build.gradle有的
defaultConfig下添加
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和externalNativeBuild
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'
       }
   }
dependencies下添加
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
lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

针对报错:

Errors while building APK. You can find the errors in the 'Messages' view
修改包名
applicationId "com.test.aytestcc"
修改signingConfigs
 signingConfigs {
        config {
            keyAlias 'aytestccalias'
            keyPassword '123456'
            storeFile file('aytestcc.keystore')
            storePassword '123456'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

keyAlias 与storeFile file与生成证书的命令相对应

修改buildTypes
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'
        }
    }

simpleDemo的AndroidManifest.xml

   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>

settings.gradle

添加库文件

include ':openCVLibrary342'

local.properties

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:西瓜视频链接

新建并修改Java文件和xml文件

复制粘贴文件

把示例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

屏蔽CameraPreviews.java的1行代码Android Studio uniapp新项目集成HyperLPR开源项目(一)_第7张图片

//mPaint.setColor(ContextCompat.getColor(context, R.color.colorAccent));

修改文件MainActivity.java和CameraActivity.java

除保留包名为com.test.aytestcc,其余全部复制粘贴

修改res\layout文件activity_main.xml和activity_camera.xml

把中间内容全部复制粘贴,另外activity_camera.xml的主树修改成 LinearLayout,不然会报错

LinearLayout

1.5:B站视频链接
1.5:西瓜视频链接

七、修改javaWarpper.cpp

修改新项目cpp下的javaWarpper.cpp文件,这一步尤为重要,不然PlateRecognition.java下是报错的,具体原因本人才疏学浅,只知道乱改。。
将原有函数名的pr_platerecognization换成com_test_aytestcc(根据自己包名替换),

com_test_aytestcc

将原有pr/platerecognization,换成com/test/aytestcc(根据自己包名替换)

com/test/aytestcc

这个也是我突发奇想试着改了的,哈哈,好在对了

八、Clean Project

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第8张图片

九、ReBuild Project

Android Studio uniapp新项目集成HyperLPR开源项目(一)_第9张图片
1.6:B站视频链接
1.6:西瓜视频链接

十、运行调试并打包

不报错,就可以选择手机(手机已设置开发者模式),点运行,然后点拍照,对准一个有车牌图片的图片,就能有示例运行效果。

至此,新项目整合车牌识别终于告一段落,后面还有把车牌传回到uniapp里面做相应处理,还需对示例代码做变更,后面文章继续分享,若您遇到什么问题,欢迎联系。这些若没有好友及热心网友回复,百度几天也一定不会有结果,真开心受过几天折磨后,终于有点效果,希望本篇文章,能帮助正在困惑的你,有问题,欢迎指正。
1.7:B站视频链接
1.7:西瓜视频链接

十一、对应视频链接

B站
西瓜视频

赠送

新建identifyApplication类

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;
    }
}
修改simpleDemo的AndroidManifest.xml

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原生数据交互

码云代码链接

你可能感兴趣的:(uniapp,HyperLPR,车牌识别)