Android平台车牌识别开发手册
2016-06-24 13:44
543 查看
目录
1
演示程序安装与激活 5
1.1
安装 5
1.2 Android版本 5
1.3
激活方式介绍 5
2
拍摄注意事项 6
2.1
一般要求 6
2.2
对拍摄图像的要求 6
3
接口概述与集成说明 6
4
调用识别Activity 7
4.1
识别参数说明 7
4.2
识别返回值说明 8
5
调用识别Service 11
5.1
调用Service方式概述 11
5.2
示例代码 11
6
调用识别参数配置函数 15
7序列号在线激活方式的集成步骤 17
7.1
资源文件的拷贝 17
7.2配置AndroidManifest.xml文件, 18
7.3
授权服务的代码集成 20
7.4识别方法选择: 22
进入拍照识别界面代码: 22
进入视频识别界面代码: 22
进入选择识别界面代码: 22
7.5识别服务的集成 22
7.6
结束 24
8.项目授权方式的集成步骤 24
8.1资源文件拷贝 24
8.2配置AndroidManifest.xml文件 25
8.3识别方法选择: 28
进入拍照识别界面代码: 28
进入视频识别界面代码: 28
进入选择识别界面代码: 28
8.4识别服务的集成 28
8.5结束 30
9.TF授权方式的集成步骤 30
9.1资源文件设置 30
9.2配置AndroidManifest.xml文件 31
9.3识别方法选择: 33
进入拍照识别界面代码: 33
进入视频识别界面代码: 33
进入选择识别界面代码: 34
9.4识别服务的集成 34
9.5识别服务的代码 34
9.6
结束 35
10.SIM卡授权方式的集成步骤(请参照序列号集成步骤) 35
1
1、 在线序列号激活方式。
由文通公司提供含有序列号的Excel文件,用户在调用程序中指定sn参数即用于该设备的某序列号,首次调用识别时设备须联网。可指定绑定设备deviceid或绑定SIM卡序号。默认绑定deviceid。
2、 离线文件激活方式。
用户先提供文通公司含有deviceid或androidid的Excel文件(第一列为deviceid,第二列为androidid),然后文通公司提供对应设备的激活文件压缩包,压缩包中激活文件的数目与设备数目一致,以[deviceid]_cp.txt命名,用户在调用程序中指定authfile参数即激活文件的路径和名称,首次调用时设备无需联网。如authfile参数为null或等于””时,默认激活文件路径为根目录下的[deviceid]_cp.txt,当激活文件存在时做此激活操作。
3、 TF卡模式。
需使用文通公司授权的TF卡。
4、 项目授权方式。
项目授权文件中限制如下内容:开发码参数、用户程序包名、识别核心版本号、使用截止时间、用户程序名称、用户公司名称;
开发码与调用识别时传递的devcode参数比对,开发码由文通公司与项目授权文件一并提供;
程序包名与AndroidMenifest.xml中package比对;
使用截止时间与当前系统时间比对;
授权文件中核心版本号与底层核心版本号比对, 默认限制前两位;
项目名称与strings.xml中app_name比对;
公司名称与strings.xml中company_name比对;
项目授权文件需放入项目assets文件夹中。
注意:如果使用1或2
所列的激活方式,请选择指定sn参数或authfile参数 ,不要同时指定sn参数和authfile参数,否则将只按1的方式进行激活,设置此两个参数请参见下文代码示例。
**采用项目授权无需调用验证授权服务
2
目前支持的JPEG图像的分辨率为2048*1536像素及以下,支持图像中车牌的默认实际宽度为80-400像素。
2.1
图像文字清晰,人眼可辨别;
对比度、亮度适中;
拍摄时不要使车牌过度倾斜;
尽量不要使拍摄角度倾斜过大,以免造成图像变形成梯形;
3
用户可以调用Activity或Service的方式集成识别功能,识别Activity只支持JPG图片格式,识别Service也支持JPG图片格式,推荐使用Service方式集成;用户可以通过调用函数的方式设置识别参数,详情见后面章节。
注意将“plate_id_sdk集成所需文件”文件夹下的所有内容放到Android项目的根目录下;注意拷贝assets、lib、libs及res的内容到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中;如果采用TF卡授权方式,请将
“TF”文件夹中的相关文件替换到项目中;如果采用序列号激活方式绑定设备,请将“序列号” 文件夹中的相关文件替换到项目中;
注意当与文通Android证件识别集成到一个项目中时,请删除lib文件夹下的misc_crypto.jar(如果有的话),否则会引起冲突。
4
5.1
Service接口包括两个Service,分别是验证Service AuthService和识别Service
RecogService:
验证Service所需参数:序列号方式激活时用sn参数;激活文件方式时用authfile参数;不要同时指定sn参数和authfile参数,否则将只按序列号方式进行激活;如果未设置sn参数和authfile参数,将在根目录寻找激活文件。
TF卡授权方式不用调用验证Service,只调用识别Service即可。
验证Service调用顺序:bindService、激活验证函数getAuth、unbindService;即每次产生验证Service新实例完成验证和激活的操作。
识别Service调用顺序:在验证Service的返回值ReturnAuthority为0时,每次识别时调用依次调用一次bondService、读取初始化状态函数getInitPlateIDSDK、设置识别参数的函数setRecogArgu、识别函数doRecogDetail、unbondService。
注意:Service方式支持JEPG图像文件识别。
public String[]doRecogDetail(PlateRecognitionParameter prp)//用于识别JEPG图片。
5.2
<intent-filter >
<action android:name="wintone.plateid.authservice"/>
</intent-filter>
</service>
<service android:enabled="true" android:name="com.wintone.plateid.RecogService">
<intent-filter >
<action android:name="wintone.plateid.recogService"/>
</intent-filter>
</service>
Intent authIntent = new Intent(MainActivity.this, AuthService.class);
bindService(authIntent,
authConn, Service.BIND_AUTO_CREATE);
public ServiceConnection authConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
authBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "authConn onServiceConnected");
authBinder = (AuthService.MyBinder) service;
Toast.makeText(getApplicationContext(), "授权验证服务 绑定成功", Toast.LENGTH_SHORT).show();
try {
// sn:采用序列号方式激活时设置此参数,否则写""
// authfile:采用激活文件方式激活时设置此参数,否则写""
//
以上俩个参数都不为""时按序列号方式激活;当sn和authfile为""时会在根目录下找激活文件
xxxxxxxxxxxxxxx_cp.txt
ReturnAuthority = authBinder.getAuth(sn, authfile);
if (ReturnAuthority != 0) {
recogButton.setEnabled(false);
String[] str = {"" + ReturnAuthority};
getResult(str);
Toast.makeText(getApplicationContext(), "授权验证失败", Toast.LENGTH_SHORT).show();
} else {
//若授权成功,则启动识别服务
recogIntent = new Intent(MainActivity.this, RecogService.class);
//startService(recogIntent);
Toast.makeText(getApplicationContext(), "授权验证成功", Toast.LENGTH_SHORT).show();
}
}catch (Exception e) {
e.printStackTrace();
Log.i(TAG, "e=" + e.toString());
}finally{
if (authBinder != null) {
unbindService(authConn);//解绑授权验证服务
}
}
}
};
recogIntent = new Intent(MainActivity.this, RecogService.class);
bindService(recogIntent, recogConn, Service.BIND_AUTO_CREATE);
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
} else {
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
cfgparameter.nContrast = 0;
cfgparameter.nOCR_Th = 2;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 0;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
PlateRecognitionParameter prp = new PlateRecognitionParameter();
prp.height = height;
prp.width = width;
prp.pic = recogPicPath;
fieldvalue = recogBinder.doRecogDetail(prp);
nRet = recogBinder.getnRet();
if (nRet != 0) {
String[] str = { "" + nRet };
getResult(str);
} else {
getResult(fieldvalue);
}
}
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
说明:本函数存在于识别Service内,参数cfgparameter见下表,其他参数请勿修改。
public String[] doRecogDetail(PlateRecognitionParameter prp)
说明:本函数存在于识别Service内,参数prp见下表。
识别接口,该函数返回的是识别后的数据。
public int getnRet() 获取识别后的返回值 nRet (详见4.2返回结果说明)
先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
将res的内容合并到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中
<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
7.3
授权服务的定义:(用户需将从销售手中获得的25位序列号替换sn,
ReturnAuthority变量为授权服务成功与否的标志,如果为0则证明授权成功)
授权服务的代码集成(具体变量的定义请详见MainActivity.java,该代码需在识别之前调用)
public ServiceConnection authConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
authBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
authBinder = (AuthService.MyBinder) service;
Toast.makeText(getApplicationContext(), R.string.auth_check_service_bind_success, Toast.LENGTH_SHORT).show();
try {
PlateAuthParameter pap = new PlateAuthParameter();
pap.sn = sn;
pap.authFile = authfile;
// sn:采用序列号方式激活时设置此参数,否则写""
// authfile:采用激活文件方式激活时设置此参数,否则写""
// 以上俩个参数都不为""时按序列号方式激活;当sn和authfile为""时会在根目录下找激活文件xxxxxxxxxxxxxxx_cp.txt
ReturnAuthority = authBinder.getAuth(pap);
if (ReturnAuthority != 0) {
Toast.makeText(getApplicationContext(),getString(R.string.license_verification_failed)+":"+ReturnAuthority,Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),R.string.license_verification_success,Toast.LENGTH_LONG).show();
}
}catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.failed_check_failure, Toast.LENGTH_SHORT).show();
e.printStackTrace();
}finally{
if (authBinder != null) {
unbindService(authConn);
}
}
}
授权服务的调用:(在Activity的oncreate()中调用,必须在进入拍照界面前进行调用)
Intent authIntent = new Intent(MainActivity.this, AuthService.class);
bindService(authIntent,authConn,Service.BIND_AUTO_CREATE);
cameraintent.putExtra("camera", false);
startActivity(cameraintent);
video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<activity
android:name="com.wintone.plateid.MainActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustUnspecified|stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--
guangda
<category android:name="android.intent.category.INFO" />
-->
<!-- Common -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
然后再打开res/values/strings.xml,将以下内容复制进去,其中的内容要改成用户提供的相应信息:
<string name="app_name">快号通开发包</string>
<string name="company_name">北京文通科技有限公司</string>
cameraintent.putExtra("camera", false);
startActivity(cameraintent);
video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
cameraintent.putExtra("camera", false);
startActivity(cameraintent);
video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
1
演示程序安装与激活 5
1.1
安装 5
1.2 Android版本 5
1.3
激活方式介绍 5
2
拍摄注意事项 6
2.1
一般要求 6
2.2
对拍摄图像的要求 6
3
接口概述与集成说明 6
4
调用识别Activity 7
4.1
识别参数说明 7
4.2
识别返回值说明 8
5
调用识别Service 11
5.1
调用Service方式概述 11
5.2
示例代码 11
6
调用识别参数配置函数 15
7序列号在线激活方式的集成步骤 17
7.1
资源文件的拷贝 17
7.2配置AndroidManifest.xml文件, 18
7.3
授权服务的代码集成 20
7.4识别方法选择: 22
进入拍照识别界面代码: 22
进入视频识别界面代码: 22
进入选择识别界面代码: 22
7.5识别服务的集成 22
7.6
结束 24
8.项目授权方式的集成步骤 24
8.1资源文件拷贝 24
8.2配置AndroidManifest.xml文件 25
8.3识别方法选择: 28
进入拍照识别界面代码: 28
进入视频识别界面代码: 28
进入选择识别界面代码: 28
8.4识别服务的集成 28
8.5结束 30
9.TF授权方式的集成步骤 30
9.1资源文件设置 30
9.2配置AndroidManifest.xml文件 31
9.3识别方法选择: 33
进入拍照识别界面代码: 33
进入视频识别界面代码: 33
进入选择识别界面代码: 34
9.4识别服务的集成 34
9.5识别服务的代码 34
9.6
结束 35
10.SIM卡授权方式的集成步骤(请参照序列号集成步骤) 35
1
演示程序安装与激活
1.1 安装
安装文通车牌演示程序plate_id_sample_service.apk。1.2 Android版本
支持Android2.3 – 5.11.3 激活方式介绍
在首次调用时提供序列号或激活文件进行激活。1、 在线序列号激活方式。
由文通公司提供含有序列号的Excel文件,用户在调用程序中指定sn参数即用于该设备的某序列号,首次调用识别时设备须联网。可指定绑定设备deviceid或绑定SIM卡序号。默认绑定deviceid。
2、 离线文件激活方式。
用户先提供文通公司含有deviceid或androidid的Excel文件(第一列为deviceid,第二列为androidid),然后文通公司提供对应设备的激活文件压缩包,压缩包中激活文件的数目与设备数目一致,以[deviceid]_cp.txt命名,用户在调用程序中指定authfile参数即激活文件的路径和名称,首次调用时设备无需联网。如authfile参数为null或等于””时,默认激活文件路径为根目录下的[deviceid]_cp.txt,当激活文件存在时做此激活操作。
3、 TF卡模式。
需使用文通公司授权的TF卡。
4、 项目授权方式。
项目授权文件中限制如下内容:开发码参数、用户程序包名、识别核心版本号、使用截止时间、用户程序名称、用户公司名称;
开发码与调用识别时传递的devcode参数比对,开发码由文通公司与项目授权文件一并提供;
程序包名与AndroidMenifest.xml中package比对;
使用截止时间与当前系统时间比对;
授权文件中核心版本号与底层核心版本号比对, 默认限制前两位;
项目名称与strings.xml中app_name比对;
公司名称与strings.xml中company_name比对;
项目授权文件需放入项目assets文件夹中。
注意:如果使用1或2
所列的激活方式,请选择指定sn参数或authfile参数 ,不要同时指定sn参数和authfile参数,否则将只按1的方式进行激活,设置此两个参数请参见下文代码示例。
**采用项目授权无需调用验证授权服务
2
拍摄注意事项
目前支持的JPEG图像的分辨率为2048*1536像素及以下,支持图像中车牌的默认实际宽度为80-400像素。2.1
一般要求
图像文字清晰,人眼可辨别;对比度、亮度适中;
2.2 对拍摄图像的要求
拍摄时做好聚焦,以免图像模糊不清;拍摄时不要使车牌过度倾斜;
尽量不要使拍摄角度倾斜过大,以免造成图像变形成梯形;
3
接口概述与集成说明
用户可以调用Activity或Service的方式集成识别功能,识别Activity只支持JPG图片格式,识别Service也支持JPG图片格式,推荐使用Service方式集成;用户可以通过调用函数的方式设置识别参数,详情见后面章节。注意将“plate_id_sdk集成所需文件”文件夹下的所有内容放到Android项目的根目录下;注意拷贝assets、lib、libs及res的内容到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中;如果采用TF卡授权方式,请将
“TF”文件夹中的相关文件替换到项目中;如果采用序列号激活方式绑定设备,请将“序列号” 文件夹中的相关文件替换到项目中;
注意当与文通Android证件识别集成到一个项目中时,请删除lib文件夹下的misc_crypto.jar(如果有的话),否则会引起冲突。
4
调用识别Activity(V1.3.0.5不再使用)
4.1 识别参数说明
识别Activity具有如下参数:类型 | 名称 | 说明 | 示例 |
String | cls | 接收识别返回值的包名类名 | com.wintone.demo.PlateIDRunner |
String | pic | 图片路径 | |
int | imageformat | 图像格式 | 1 |
int | width | 图像宽度 | 420 |
int | height | 图像高度 | 232 |
int | bVertFlip | 0 | |
int | bDwordAligned | 1 | |
boolean | GetVersion | 是否需要获取开发包的版本信息 | true |
String | sn | 序列号,第一次调用时激活,如不设置此项需通过自动激活或手动激活页面输入序列号。 | 请输入大写序列号 |
String | authfile | 激活文件路径,激活文件中保存了用于该设备的序列号和激活码,不用时可设置为”” | |
String | userdata | 用户想在识别后和识别结果一起传回的字符串 | |
String | returntype | 接收识别结果的方式 | 默认值””,代表用第一种方式接收识别结果;值”withvalue”代表用第二种方式。详见示例程序章节。 |
4.2 识别返回值说明
识别Activity具有如下返回值:类型 | 名称 | 说明 | 备注 |
int | nRet | 识别结果标志 | 0成功; 1 FindPlate(没有找到车牌) 2 车牌评价值(0分) 3 车牌评价值(不及格) 4 车牌识别分数(0分) 5 车牌识别分数(不及格) -1001 读jpg图片错误,可能是图片超过2048*1536分辨率 -10001 未调用初始化函数 -10003 没有激活或激活码校验失败 -10004 指定序列号为null或"" -10005 未连接到服务器 -10006 获取激活码失败或未连接到服务器 -10007 授权服务器无此序列号 -10008 序列号已使用 -10009 无法创建授权文件 -10010 校验激活码失败 -10011 其他错误 -10012 未激活 -10015 激活文件校验失败 -10401 开发码错误或未找到authmode.lsc文件 -10402 设备型号未授权 -10500 未检测到SIM卡 -1008 未读到TF卡; -1005 TF卡授权模式下使用了非TF卡授权的动态库; 20 所插TF中的license\license.dat授权文件不匹配;或非TF卡授权模式下使用了TF卡模式动态库; -8:license\license.dat授权文件未找到 -10600 其他错误; -10601 开发码错误; -10602 程序包名错误; -10603 截止时间过期; -10604 核心版本号错误; -10605 项目名称错误; -10606 公司名称错误。 |
String[] | GetFieldName | 字段名 | "车牌号", "车牌颜色", "车牌颜色代码", "车牌类型代码", "整牌可信度", "亮度评价","车牌运动方向", "车牌左上点横坐标", "车牌左上点纵坐标", "车牌右下点横坐标", "车牌右下点纵坐标", "时间","车的亮度", "车的颜色" |
String[] | GetRecogResult | 字段值 | 车牌颜色编码: 0 未知 1 蓝 2 黄 3 白 4 黑 5 绿 车牌类型编码: 0 未知车牌 1 蓝牌小汽车 2 黑牌小汽车 3 单排黄牌 4 双排黄牌(大车尾牌,农用车) 5 警车车牌 6 武警车牌 7 个性化车牌 8 单排军车 9 双排军车 10 使馆牌 11 香港牌 12 拖拉机 车辆亮度编码: 0 深 1 浅 车辆颜色编码: 0 白 1 灰(银) 2 黄 3 粉 4 红 5 绿 6 蓝 7 棕 8 黑 运动方向编码: 1 左 2 右 3 上 4 下 |
String | ReturnGetVersion | 取版本信息,如果定义了GetVersion为true才能取版本信息 | |
String | ReturnUserData | 返回用户自定义数据参数userdata | |
String | ReturnLPFileName | 用户指定的图像路径 |
5 调用识别Service
5.1
调用Service方式概述
Service接口包括两个Service,分别是验证Service AuthService和识别ServiceRecogService:
验证Service所需参数:序列号方式激活时用sn参数;激活文件方式时用authfile参数;不要同时指定sn参数和authfile参数,否则将只按序列号方式进行激活;如果未设置sn参数和authfile参数,将在根目录寻找激活文件。
TF卡授权方式不用调用验证Service,只调用识别Service即可。
验证Service调用顺序:bindService、激活验证函数getAuth、unbindService;即每次产生验证Service新实例完成验证和激活的操作。
识别Service调用顺序:在验证Service的返回值ReturnAuthority为0时,每次识别时调用依次调用一次bondService、读取初始化状态函数getInitPlateIDSDK、设置识别参数的函数setRecogArgu、识别函数doRecogDetail、unbondService。
注意:Service方式支持JEPG图像文件识别。
public String[]doRecogDetail(PlateRecognitionParameter prp)//用于识别JEPG图片。
5.2
示例代码
5.2.1 在AndroidManifest.xml中定义Service
<service android:enabled="true" android:name="com.wintone.plateid.AuthService"><intent-filter >
<action android:name="wintone.plateid.authservice"/>
</intent-filter>
</service>
<service android:enabled="true" android:name="com.wintone.plateid.RecogService">
<intent-filter >
<action android:name="wintone.plateid.recogService"/>
</intent-filter>
</service>
5.2.2 绑定授权验证服务
//绑定授权验证服务Intent authIntent = new Intent(MainActivity.this, AuthService.class);
bindService(authIntent,
authConn, Service.BIND_AUTO_CREATE);
5.2.3 授权验证服务绑定后的操作
//授权验证服务绑定后的操作public ServiceConnection authConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
authBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "authConn onServiceConnected");
authBinder = (AuthService.MyBinder) service;
Toast.makeText(getApplicationContext(), "授权验证服务 绑定成功", Toast.LENGTH_SHORT).show();
try {
// sn:采用序列号方式激活时设置此参数,否则写""
// authfile:采用激活文件方式激活时设置此参数,否则写""
//
以上俩个参数都不为""时按序列号方式激活;当sn和authfile为""时会在根目录下找激活文件
xxxxxxxxxxxxxxx_cp.txt
ReturnAuthority = authBinder.getAuth(sn, authfile);
if (ReturnAuthority != 0) {
recogButton.setEnabled(false);
String[] str = {"" + ReturnAuthority};
getResult(str);
Toast.makeText(getApplicationContext(), "授权验证失败", Toast.LENGTH_SHORT).show();
} else {
//若授权成功,则启动识别服务
recogIntent = new Intent(MainActivity.this, RecogService.class);
//startService(recogIntent);
Toast.makeText(getApplicationContext(), "授权验证成功", Toast.LENGTH_SHORT).show();
}
}catch (Exception e) {
e.printStackTrace();
Log.i(TAG, "e=" + e.toString());
}finally{
if (authBinder != null) {
unbindService(authConn);//解绑授权验证服务
}
}
}
};
5.2.4 绑定识别服务
//绑定识别服务recogIntent = new Intent(MainActivity.this, RecogService.class);
bindService(recogIntent, recogConn, Service.BIND_AUTO_CREATE);
5.2.5 识别服务绑定后的操作
//识别服务绑定后的操作public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
} else {
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
cfgparameter.nContrast = 0;
cfgparameter.nOCR_Th = 2;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 0;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
PlateRecognitionParameter prp = new PlateRecognitionParameter();
prp.height = height;
prp.width = width;
prp.pic = recogPicPath;
fieldvalue = recogBinder.doRecogDetail(prp);
nRet = recogBinder.getnRet();
if (nRet != 0) {
String[] str = { "" + nRet };
getResult(str);
} else {
getResult(fieldvalue);
}
}
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
6 调用识别参数配置函数
public void setRecogArgu(PlateCfgParameter cfgparameter, int imageformat, int bVertFlip, int bDwordAligned)说明:本函数存在于识别Service内,参数cfgparameter见下表,其他参数请勿修改。
类型 | 参数名称 | 取值范围 | 默认值 |
int | nPlateLocate_Th | 定位阈值 (取值范围0-9,7:默认阈值,0:最宽松的阈值,9:最严格的阈值) | 5 |
int | nOCR_Th | 识别阈值(取值范围0-9,5:默认阈值0:最宽松的阈值9:最严格的阈值) | 2 |
int | bIsAutoSlope | 是否要倾斜校正 | 1 |
int | nSlopeDetectRange | 倾斜校正的范围(取值范围0-16) | 0 |
String | szProvince | 省份顺序 | |
int | nContrast | 清晰度指数(取值范围0-9,最模糊时设为1;最清晰时设为9) | 0(不校验) |
int | bIsNight | 是否夜间模式:1是;0不是 | 0 |
int | individual | 是否开启个性化车牌:0是;1不是 | 0 |
int | tworowyellow | 双层黄色车牌是否开启:2是;3不是 | 3 |
int | armpolice | 单层武警车牌是否开启:4是;5不是 | 5 |
int | tworowarmy | 双层军队车牌是否开启:6是;7不是 | 7 |
int | tractor | 农用车车牌是否开启:8是;9不是 | 9 |
int | onlytworowyellow | 只识别双层黄牌是否开启:10是;11不是 | 11 |
int | embassy | 使馆车牌是否开启:12是;13不是 | 13 |
int | onlylocation | 只定位车牌是否开启:14是;15不是 | 15 |
int | armpolice2 | 双层武警车牌是否开启:16是;17不是 | 17 |
说明:本函数存在于识别Service内,参数prp见下表。
识别接口,该函数返回的是识别后的数据。
类型 | 参数名称 | 默认值 | |
byte[] | picByte | 相机获取的字节数组数据 | |
String | pic | 拍照识别,图片的存储路径 | |
int | width | 图像宽度 | |
int | heigth | 图像高度 | |
String | userdata | 用户自定义数据参数userdata | |
String | devCode | 开发码 | |
String | dataFile | 时间授权文件路径 | |
String | versionfile | 版本授权文件路径 | |
boolean | isCheckDevType | 是否检查设备型号 | false |
int | plateIDCfg.bRotate | 预览图片在进行识别时需要旋转的角度: 0:不旋转;1:90度;2:旋转180;3:旋转270 | 0 |
int | plateIDCfg.left | 扫描框在预览图片上所对应的左坐标点 | 0 |
int | plateIDCfg.right | 扫描框在预览图片上所对应的右坐标点 | 0 |
int | plateIDCfg.top | 扫描框在预览图片上所对应的上坐标点 | 0 |
int | plateIDCfg.bottom | 扫描框在预览图片上所对应的下坐标点 | 0 |
7序列号在线激活方式的集成步骤
7.1 资源文件的拷贝
将assets文件夹、lib文件夹、libs文件夹全部按照下图的目录结构复制到集成的项目中:先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
将res的内容合并到您的项目中;注意将AndroidManifest.xml里面的内容和res/values/strings.xml的内容合并到项目相关文件中
7.2配置AndroidManifest.xml文件,
打开要集成的项目的AndroidManifest.xml文件,将以下权限、相应的service和activity加入其中:<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
7.3
授权服务的代码集成
授权服务的定义:(用户需将从销售手中获得的25位序列号替换sn,ReturnAuthority变量为授权服务成功与否的标志,如果为0则证明授权成功)
授权服务的代码集成(具体变量的定义请详见MainActivity.java,该代码需在识别之前调用)
public ServiceConnection authConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
authBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
authBinder = (AuthService.MyBinder) service;
Toast.makeText(getApplicationContext(), R.string.auth_check_service_bind_success, Toast.LENGTH_SHORT).show();
try {
PlateAuthParameter pap = new PlateAuthParameter();
pap.sn = sn;
pap.authFile = authfile;
// sn:采用序列号方式激活时设置此参数,否则写""
// authfile:采用激活文件方式激活时设置此参数,否则写""
// 以上俩个参数都不为""时按序列号方式激活;当sn和authfile为""时会在根目录下找激活文件xxxxxxxxxxxxxxx_cp.txt
ReturnAuthority = authBinder.getAuth(pap);
if (ReturnAuthority != 0) {
Toast.makeText(getApplicationContext(),getString(R.string.license_verification_failed)+":"+ReturnAuthority,Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(),R.string.license_verification_success,Toast.LENGTH_LONG).show();
}
}catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.failed_check_failure, Toast.LENGTH_SHORT).show();
e.printStackTrace();
}finally{
if (authBinder != null) {
unbindService(authConn);
}
}
}
授权服务的调用:(在Activity的oncreate()中调用,必须在进入拍照界面前进行调用)
Intent authIntent = new Intent(MainActivity.this, AuthService.class);
bindService(authIntent,authConn,Service.BIND_AUTO_CREATE);
7.4识别方法选择:
进入拍照识别界面代码:
Intent cameraintent = new Intent(MainActivity.this,MemoryCameraActivity.class);cameraintent.putExtra("camera", false);
startActivity(cameraintent);
进入视频识别界面代码:
Intent video_intent = new Intent();video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
进入选择识别界面代码:
Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT);selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
7.5识别服务的集成
绑定识别服务Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
7.6 结束
如果通过以上步骤进行集成,并出现相应的集成问题,请及时联系技术开发人员。8.项目授权方式的集成步骤
8.1资源文件拷贝
用户向北京文通科技有限公司的销售提供需要绑定的一些参数,然后销售会给用户一个项目授权文件(authmode.lsc);然后将assets文件夹、lib文件夹、libs文件夹全部按照下图的目录结构复制到集成的项目中并将新得到的authmode.lsc复制进集成项目中的assets文件夹内:先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
8.2配置AndroidManifest.xml文件
打开要集成的项目的AndroidManifest.xml文件,将以下权限、相应的service和activity加入其中:<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<activity
android:name="com.wintone.plateid.MainActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustUnspecified|stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--
guangda
<category android:name="android.intent.category.INFO" />
-->
<!-- Common -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
然后再打开res/values/strings.xml,将以下内容复制进去,其中的内容要改成用户提供的相应信息:
<string name="app_name">快号通开发包</string>
<string name="company_name">北京文通科技有限公司</string>
8.3识别方法选择:
进入拍照识别界面代码:
Intent cameraintent = new Intent(MainActivity.this,MemoryCameraActivity.class);cameraintent.putExtra("camera", false);
startActivity(cameraintent);
进入视频识别界面代码:
Intent video_intent = new Intent();video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
进入选择识别界面代码:
Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT);selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
8.4识别服务的集成
绑定识别服务Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
8.5结束
如果通过以上步骤进行集成,并出现相应的集成问题,请及时联系技术开发人员。9.TF授权方式的集成步骤
9.1资源文件设置
用户向北京文通科技有限公司的销售索要authmode.lsc文件和TF存储器;然后将assets文件夹、lib文件夹、libs文件夹全部按照下图的目录结构复制到集成的项目中并将新得到的authmode.lsc复制进集成项目中的assets文件夹内:先选中所有的jar包,然后add Path,右键lib文件夹点击Buid
Path选项并选择config buid Path选项,点击Order and Export选项,将android_auth.jar、ksoap2-android-assembly-2.4-jar-with-dependencies.jar、plate_id_sdk.jar、
bcprov-ext-jdk15-146.jar、pki.jar等全部勾选并点击“确定”按钮,如图:
9.2配置AndroidManifest.xml文件
打开要集成的项目的AndroidManifest.xml文件,将以下权限、相应的service和activity加入其中:<!-- 读取机器各种ID的权限
-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 在SDCard中创建与删除文件权限
-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限
-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 关闭该包下的所有应用程序
-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- 访问internet权限
-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问震动权限
-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--
guangda
<uses-permission android:name="cybertech.pstore.permission.COMPONENT" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_USERINFO" />
<uses-permission android:name="cybertech.permission.READ_PSTORE_LINKINFO" />
-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<service
android:name="com.wintone.plateid.AuthService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.authservice" />
</intent-filter>
</service>
<service
android:name="com.wintone.plateid.RecogService"
android:enabled="true" >
<intent-filter>
<action android:name="wintone.plateid.recogService" />
</intent-filter>
</service>
<activity
android:name="com.wintone.plateid.MemoryCameraActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboard|keyboardHidden">
</activity>
<activity
android:name="com.wintone.plateid.MemoryResultActivity">
</activity>
<activity
android:name="com.wintone.plateid.ResultActivity"
android:screenOrientation="portrait" />
<activity android:name="com.wintone.plateid.CameraActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="wintone.camera" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注册时请注意更换包名!!
9.3识别方法选择:
进入拍照识别界面代码:
Intent cameraintent = new Intent(MainActivity.this,MemoryCameraActivity.class);cameraintent.putExtra("camera", false);
startActivity(cameraintent);
进入视频识别界面代码:
Intent video_intent = new Intent();video_intent.setClass(getApplicationContext(), MemoryCameraActivity.class);
video_intent.putExtra("camera", true);
startActivity(video_intent);
进入选择识别界面代码:
Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT);selectIntent.addCategory(Intent.CATEGORY_OPENABLE);
selectIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(selectIntent,"Select Picture");
startActivityForResult(wrapperIntent, SELECT_RESULT_CODE);
9.4识别服务的集成
将示例代码中集成所需文件夹内的TF卡授权文件夹内的授权文件复制到项目中的assets文件夹内。9.5识别服务的代码
绑定识别服务Intent authIntent = new Intent(MemoryCameraActivity.this,
RecogService.class);
bindService(authIntent, recogConn, Service.BIND_AUTO_CREATE);
识别服务代码
public ServiceConnection recogConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
recogConn = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
recogBinder = (RecogService.MyBinder) service;
iInitPlateIDSDK = recogBinder.getInitPlateIDSDK();
if (iInitPlateIDSDK != 0) {
nRet = iInitPlateIDSDK;
String[] str = { "" + iInitPlateIDSDK };
getResult(str);
}
// recogBinder.setRecogArgu(recogPicPath, imageformat,
// bGetVersion, bVertFlip, bDwordAligned);
PlateCfgParameter cfgparameter = new PlateCfgParameter();
cfgparameter.armpolice = 4;
cfgparameter.armpolice2 = 16;
cfgparameter.embassy = 12;
cfgparameter.individual = 0;
// cfgparameter.nContrast = 9;
cfgparameter.nOCR_Th = 0;
cfgparameter.nPlateLocate_Th = 5;
cfgparameter.onlylocation = 15;
cfgparameter.tworowyellow = 2;
cfgparameter.tworowarmy = 6;
cfgparameter.szProvince = "";
cfgparameter.onlytworowyellow = 11;
cfgparameter.tractor = 8;
cfgparameter.bIsNight = 1;
recogBinder.setRecogArgu(cfgparameter, imageformat, bVertFlip,
bDwordAligned);
// fieldvalue = recogBinder.doRecog(recogPicPath, width,
// height);
if (recogBinder != null) {
unbindService(recogConn);
}
}
};
9.6 结束
如果通过以上步骤进行集成,并出现相应的集成问题,请及时联系技术开发人员。10.SIM卡授权方式的集成步骤(请参照序列号集成步骤)
相关文章推荐
- android四大组件之Service(1) 介绍
- Android Touch事件传递机制
- 在android布局中使用include和merge标签
- AndroidStudio2.2 Preview3中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别
- android自定义view的自定义属性
- Android中冷门却超级有用的属性设置
- 安卓简单技术-textview跑马灯的实现
- Error:(4) Error retrieving parent for item: No resource found that matches the given name 'android:T
- android intent 传递list或者对象
- Using Dagger2 in Android
- Android之ListView图片加载错位问题解决
- Android与JS混编(js调用android相机)
- Android API 包解析01-Android包
- Android service(四)Intent服务
- Android里的Binder机制(简洁易懂)
- Android4.4沉浸状态栏全解析
- Android应用图标
- ANDROID版本号和版本名称的重要性介绍
- Android 自定义View(四) 时钟clockView
- Android viewpager实现无限循环轮播