调用其他照相机应用拍照

来源:互联网 发布:linux文件权限为400 编辑:程序博客网 时间:2024/04/29 20:47

一直都想把外部调用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 = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

更多内容请参考,我上来就提供的连接,google 还是很给力的给提供了所有代码,我也会在最后提供完整的测试代码,所有的代码经过本人验证。

PS还有很多不足之处,希望有大神帮忙指正。


稍后会提供链接

下载地址

http://download.csdn.net/detail/shen332401890/5743813 
原创粉丝点击