一直都想把外部调用camera拍照研究一下,抽了好几天下班时间终于完成了。
代码由本人亲测,日志中提供的代码为部分代码。如果提供的源码无法运行通过,可能有以下几个原因:1,没有SD卡,这一点我兼容没有做好。2,摄像头有问题。代码在最后提供!如有问题请留言。我是菜鸟,勿喷。
http://developer.android.com/training/camera/photobasics.html 这个是google的教程,我认为他几乎把所有的有关于外部调用Camera的内容都写了,所以这里我就翻译一下大体过程
首先是Request Camera Permission
这里主要是APK依赖告诉别人你需要一个camera之类的。
其实重点就是先要检测你的手机是否包含FEATURE_CAMERA
/*
* 判断是否具有摄像头功能
*/
private boolean isSupportCameraFeature(MainActivity context){
if(mIsSupportCameraFeature!=(-1)) {
return mIsSupportCameraFeature==SUPPORTED_CAMERA;
}else{
PackageManager pm= context.getPackageManager();
FeatureInfo[] features=pm.getSystemAvailableFeatures();
for(FeatureInfo f : features){
Log.v("xxxx","f"+f.name);
if(f.name.equals(PackageManager.FEATURE_CAMERA)) {
mIsSupportCameraFeature = SUPPORTED_CAMERA;
//Toast.makeText(this, "has camera", 1).show();
return true;
}
}
}
return false;
}
Take a Photo with the Camera App
The Intent itself, a call to start the external Activity, and some code to handle the image data when focus returns to your activity.
通过发送一个intent到其他的Activity,然后其他Camera应用给你返回数据
private void dispatchTakePictureIntent(int actionCode) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, actionCode);
}
很简单这里 最后覆写一下 onActivityResult 接收一下一下数据就OK了
这里你接收到的也会是一个intent 这个intent里面包含了照片的数据data
通过以下这种方式 获取数据 并设置在你的ImageView上
private void handleSmallCameraPhoto(Intent intent) {
Bundle extras = intent.getExtras();
mImageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(mImageBitmap);
}
这样 你不但拍照了还能显示,存储的话你只要把这里的Bitmap存储就OK了,想知道更多请你去google就OK了,一会会介绍另一种保存的方法。
/*稍微多介绍一点*/
因为我测试的手机只有一个camera apk所以很简单,当有很多的时候就很烦了,google给了一个测试代码,测试有多少个应用可以支持这个MediaStore.ACTION_IMAGE_CAPTURE
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list =
packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
有好多次看帖子有人问是否可以设置保存路径,通过源码看了这么久,知道可以,但是需要传递一个URI ,这个URI其实也就是路径拉。
下面看一下设置路径的intent如何发送
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(takePictureIntent, actionCode);
这里的f 是一个创建的File。(请记得添加SD卡写权限)
如此就可以将图片保存在f所代表的文件了,这种情况下,Camera 没有返回intent只是简单的返回到调用的应用,所以这里返回的intent是空的,我验证的结果如此。
这里如何设置图片呢,很简单,通过路径读取。然后设置,没啥说的。
到这里差不多该完成的就完成了,如果说有啥不足,就是退出应用的时候,一定时间内,gallery里面无法看到新拍的照片,不用担心google已经提供好了完善的代码用于gallery同步。
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
更多内容请参考,我上来就提供的连接,google 还是很给力的给提供了所有代码,我也会在最后提供完整的测试代码,所有的代码经过本人验证。
PS还有很多不足之处,希望有大神帮忙指正。