版权声明:本文由 Micheal 超 博客 创作,未经博主允许不得转载。 https://blog.csdn.net/qq_42887760/article/details/86704478
图像选择功能 + 拍照功能
- 图像选择功能(调用系统函数实现)
- 拍照功能(调用API函数)
- 页面跳转
通过Intent和startActivity方法实现
前提:
已经完成上一节的界面创建等工作:OpenCV-Android平台应用实战 - 银行卡卡号识别(03、算法流程与界面设计)
目录结构如下:
AndroidManifest.xml代码:
- 添加如下代码即可:
<!-- 设置访问 SD卡的 读写 权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 设置摄像头的访问权限 -->
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
- 图片:
MainActivity.java 代码:
package com.example.opencvtest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_take_picture,btn_select_picture;
private String TAG = "OPenCV-Android";
private int REQUEST_CAPTURE_IMAGE = 1;
private Uri fileUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_take_picture = (Button) this.findViewById(R.id.take_picture_btn);
btn_select_picture = (Button) this.findViewById(R.id.select_picture_btn);
btn_take_picture.setOnClickListener(this);
btn_select_picture.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.take_picture_btn:
start2Camera();
break;
case R.id.select_picture_btn:
pickUpImage();
break;
default:
break;
}
}
private void start2Camera() {//调用摄像头拍照的功能
//打开摄像头
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = Uri.fromFile(getSaveFilePath());
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);//指定图片输出地址
startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
}
private File getSaveFilePath() {
String status = Environment.getExternalStorageState();
if(!status.equals(Environment.MEDIA_MOUNTED)) {
Log.i(TAG, "SD Card is not suitable...");
return null;
}
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_hhmmss");
String name = df.format(new Date(System.currentTimeMillis()))+ ".jpg";
File filedir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myOcrImages");
filedir.mkdirs();
String fileName = filedir.getAbsolutePath() + File.separator + name;
File imageFile = new File(fileName);
return imageFile;
}
private void pickUpImage() {//相册选择图片的功能
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "图像选择..."), REQUEST_CAPTURE_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CAPTURE_IMAGE && resultCode == RESULT_OK) {
if(data == null) {
Intent intent = new Intent(getApplicationContext(), CardOCRActivity.class);
intent.putExtra("PICTURE-URL", fileUri);
startActivity(intent);
} else {
Uri uri = data.getData();
Intent intent = new Intent(getApplicationContext(), CardOCRActivity.class);
File f = new File(getRealPath(uri));
intent.putExtra("PICTURE-URL", Uri.fromFile(f));
startActivity(intent);
}
}
}
private String getRealPath(Uri uri) {
String filePath = null;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT){//4.4及以上
String wholeID = DocumentsContract.getDocumentId(uri);
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Images.Media.DATA };
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
sel, new String[] { id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
}else{//4.4以下,即4.4以上获取路径的方法
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
filePath = cursor.getString(column_index);
}
Log.i("CV_TAG", "selected image path : " + filePath);
return filePath;
}
}
- 解说:
-
startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
----56行代码
用来启动另一个拍照活动的,这个与startactivity是不一样的,startactivity只有一个参数,intent,这个有两个参数,第二个参数是requestcode,请求码,我们让请求码为1.
如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写 onActivityResult(int requestCode, int resultCode, Intent data)方法。
CardOCRActivity.java 代码:
package com.example.opencvtest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class CardOCRActivity extends AppCompatActivity implements View.OnClickListener {
private String TAG = "OCR-DEMO";
Button recognitionBtn;
private Uri fileUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_card_ocr);
recognitionBtn= (Button) this.findViewById(R.id.recognition_btn);
recognitionBtn.setOnClickListener(this);
fileUri = (Uri)this.getIntent().getParcelableExtra("PICTURE-URL");
if(fileUri != null) {
displaySelectedImage();
}
}
private void displaySelectedImage() {
ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileUri.getPath(), options);
int w = options.outWidth;
int h = options.outHeight;
int inSample = 1;
if(w > 1000 || h > 1000) {
while(Math.max(w/inSample, h/inSample) > 1000) {
inSample *=2;
}
}
options.inJustDecodeBounds = false;
options.inSampleSize = inSample;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bm = BitmapFactory.decodeFile(fileUri.getPath(), options);
imageView.setImageBitmap(bm);
}
@Override
public void onClick(View v) {
}
}
运行截图
- 拍照功能
- 相册选图
相册所用图片(下图)来自百度图片,若有侵权,请联系删除