有时候我们需要调用系统的相机务, 并且处理拍照成功之后的一些业务
开启相机 是这样的:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, THUMBNAIL);
}
然后输出代码 在onActivityResult()方法中
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case THUMBNAIL: {//输出缩略图
if (data != null) {
final Bundle extras = data.getExtras();
final Bitmap bitmap = (Bitmap) extras.get("data");
mImg.setImageBitmap(bitmap);
}
break;
}
}
}
}
稍稍解释一下, MediaStorexxxx是指定系统的意图, 跟我们平时比如跳转activity开启的意图是一个意思, 并且判断一下照相机是否为空, 可以保证在某些情况下, 比如root把照相机卸载了, 导致空指针会程序崩溃, 另外, 由于我们开启的是系统的api, 因此通常都是startActivityForResult(), 因为我们需要拿到系统操作之后的数据, 里面THUMBNAIL是我自定义的一个int常量, 类似这样 private static final int THUMBNAIL = 1; 用作requestCode, 输出的图片其实是一张缩略图, 观察一下你会发现质量很小...最后别忘记在manifest中当前类添加intent-filter和权限...
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />
<intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
但是我发现不加上intent-filter, 也可以成功(5.1系统).....
上面这种调用相机但是不保存拍照得到的图片,只是显示一下缩略图,一般比较少用吧?
下面这种,则是拍照成功,保存图片的开启方式, 应该这样的形式比较多用吧?:
01. 指定uri, 即图片存储的位置和名称
mPath = String.valueOf(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
mPath = mFilePath + "/" + "storage.jpg";
这里也多说几句, 我们取得的路径最后转换为String类型了, 因此我的最终图片存储路径是mPath = mFilePath + "/" + "storage.jpg"; 记住中间的符号, 如果没加, 那么你得到的图片是这样的:mFilePathstorage.jpg, 而不是我们预想的是存储于mFilePath路径下的storage.jpg这张图片. 当然, 如果你不想加 "/" , 也很简单, 保证你获得的路径是File类型的即可
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(new File(mPath));
if (intent.resolveActivity(getPackageManager()) != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//指定图片存储路径
startActivityForResult(intent, STORAGE);
}
03. 输出并保存数据,也还是在onActivityResult()中
FileInputStream fis = null;
try {
fis = new FileInputStream(mFilePath);
final Bitmap bitmap = BitmapFactory.decodeStream(fis);
mImg.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
拍照成功, 输出查看效果, 你可以到dcim目录下查看是否存在一个叫storage.jpg的图片, 存储位置和图片名称按照需求自定义即可
以上, 就是开启系统相机拍照的一些简单操作 , 其实博客上也有很多类似的文章了, 只是自己做一个笔记而已