上一篇完成了初步实现,当时说了要尽快加上相机拍照功能,于是乎,今天我又来啦。
上一篇的链接,已经不记得的小伙伴可以查看出处。
首先我还是对上篇进行一下部分的总结,可能误导了一部分人,我引入的ocr-ui包没有使用,确实,大家可以去掉,我本来没看包里什么内容就先引用过来了,后来才发现根本没用到0_0,其次类很简单也只有两个 Mainactivity和SimpleTextActivity,多余的东西可以去掉。
此次代码就只贴SimpleTextActivity部分内容了,因为这次的代码里面有很多注释内容,就是我尝试了种处理方法,但是没有必要,所以都注释了,但是这些代码在别的地方可能需要,我并没有删除,方便自己下次记忆。对于大家来说没有必要看这些乱七八糟的灰色注释,于是我节选有用的代码给大家分享一哈。
//从相册选取图片
findViewById(R.id.enhanced_photo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (hasPermission()) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUEST_ENHANCED_CODE_ALBUM);
}
}
});
//拍照选取图片
findViewById(R.id.enhanced_take_photo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
takePhoto();
}
});
首先是两个点击事件,触发一切的开始。点击之后进行权限判断,没有权限的话打回!,拍照的权限放在takePhoto里了。
/**
* 执行拍照
*/
private void takePhoto() {
if (!hasPermission()) {
return;
}
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
if (new File(path).exists()) {
try {
new File(path).createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
mTmpPath = path + "/temp.jpg";
mTmpFile = new File(mTmpPath);
mTmpFile.getParentFile().mkdirs();
Uri imageUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String authority = getPackageName() + ".provider";
imageUri = FileProvider.getUriForFile(SimpleTextActivity.this, authority, mTmpFile);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
List resInfoList = this.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
this.grantUriPermission(packageName, imageUri, FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_READ_URI_PERMISSION);
}
} else {
imageUri = Uri.fromFile(mTmpFile);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, REQUEST_ENHANCED_CODE_CAMERA);
}
其中mTmpFile和mTmpPath是成员变量,因为下面传递需要。
顺便把权限判断的请求和回调都展示一下
/**
* 判断是否有权限
* @return
*/
private boolean hasPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_PERIMISSION_CODE);
return false;
}else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERIMISSION_CODE) {
if (grantResults.length > 0) {
for (int grantResult: grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
Toast.makeText(SimpleTextActivity.this, "拒绝权限将不能正常使用!", Toast.LENGTH_SHORT).show();
return;
}
}
}
}
}
然后在相机返回照片后的处理上,也是我当初不懂踩坑的地方。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_ALBUM) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
recSimpleText(getRealPathFromURI(uri));
}
} else if (requestCode == REQUEST_ENHANCED_CODE_ALBUM) {
// 从相册返回的数据
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
recEnhancedText(getRealPathFromURI(uri));
}
} else if (requestCode == REQUEST_ENHANCED_CODE_CAMERA) {
//相机返回
recEnhancedText(mTmpPath);
}
}
一开始我和上面一样判断data是否为空然后从里面取uri,但是一直都是空!后来很纳闷为什么,但是我到现在也不知道为什么data返回就是空,然后看了一下别人的做法,并没有从data里面获取uri!而是直接从上面的mTmpPath那直接获取路径,确实不用多此一举!回头想想也是,人傻了!
然后把provider的相关也贴一下,需要留意的是现在很多使用androidx,不用v4包了,照着网上的导肯定是要飚红的。
这段贴在AndroidManifest.xml的
中
filepaths.xml
不过我写完了provider之后,有前辈说并不需要,我也不懂这个不需要是指哪部分代码不需要还是说provider不需要?反正现在运行良好不报错就行哈哈哈。
对了 ,还有一个需要注意的是,都加上竖屏锁定吧,因为在将识别后的文字展示之后,切换横屏,文字就消失了。
//设置竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
放在onCreate里。
关于布局页面,着实没啥看的。
心满意足了不?那我去瞅瞅百度人脸识别了,虽无远大造轮志向,但是大佬们造好的轮子也得会用吧!