一、概述
本章节主要讲述学习android摄像头使用中的实践以及注意点,主要分为系统Camera的调用方法、指定相片路径、原图和缩略图、注册应用为Camera应用这几部分知识。
如有错误或优化之处,欢迎留言指导。
二、调用系统Camera
核心代码:
// 隐式Intent调用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
为了调用Camera拍照后返回可以获取到图片,将启动方式换成startActivityForResult,并重写onActivityResult方法。
核心代码:
// 推荐将requestCode定义为静态常量
private static int REQ_1 = 1;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/**
* 判断系统Camera返回的结果,也可能是RESULT_CANCEL
* 如果是自定义的Activity可通过如下返回
* Intent intent = new Intent();
* setResult(RESULT_CANCELED, intent);
* finish();
*/
if (resultCode == RESULT_OK) { // 判断resultCode,RESULT_OK代表拍照成功
if (requestCode == REQ_1) { // 判断requestCode,分别处理不同Intent请求
Bundle bundle = data.getExtras(); // 获取所有返回数据
Bitmap bitmap = (Bitmap) bundle.get("data"); // 获取数据并转为Bitmap
ImageView.setImageBitmap(bitmap);
}
}
}
但是通过如上方法从data中获取后的图片为系统优化过后的缩略图,如要获取高清原图,可以通过修改图片存储路径后再读取,如下可见。
核心代码:
private String mFilePath;
// 在onCreate中初始化
mFilePath = Environment.getExternalStorageDirectory().getPath();
mFilePath = mFilePath + "/" + System.currentTimeMillis() + ".jpg";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(mFilePath)); // 导包时注意导入的是android.net.Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQ_1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == REQ_1) {
FileInputStream fis = null;
try {
fis = new FileInputStream(mFilePath);
if (fis != null) {
Bitmap bitmap = BitmapFactory.decodeStream(fis);
ImageView.setImageBitmap(bitmap);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close(); // 注意释放内存,但有时也要注意释放后可能会导致Bitmap无法显示
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
所以,调用系统相机拍照以及获取照片我们以及学会了,接下来可能有的朋友会开发美颜相机之类的App,那这类应用的必备的一步就是要把自己的app注册为Camera应用,让用户调用时可以选择用系统相机还是我们开发的相机。
核心代码:
// 剔除不支持Camera的设备
<uses-feature android:name="android.hardware.Camera" android:required="true"/>
// 权限申明,6.0在代码中还需校验
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
// 隐式调用的action
<activity android:name=".CameraActivity">
<intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
三、后言
本章节就记录到这里,下两章计划学习研究Camera1和Camera2,根据版本制作自定义相机,最后写一个兼容版本的简单相机demo。