Android 调去照相程序拍照

和调用图库选择图片一样,调用相机程序拍照也是经常遇到的。

这里做个小总结:

private void takePhoto() {// 执行拍照前应该先判断SD卡否存

String SDState = Environment.getExternalStorageState();

if (SDState.equals(Environment.MEDIA_MOUNTED)) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

ContentValues values = new ContentValues();

photoUri = this.getContentResolver().insert(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);

startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);

} else {

CommonUtil.showToast(DeviceDetailAddSelectPicActivity.this,

"内存卡存", Toast.LENGTH_LONG);

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

Log.d(TAG, "DeviceDetailAddSelectPicActivity is onActivityResult!");

super.onActivityResult(requestCode, resultCode, data);

if (resultCode == Activity.RESULT_OK) {

doPhoto(requestCode, data);

} else if (resultCode == Activity.RESULT_CANCELED) {

CommonUtil.showToast(DeviceDetailAddSelectPicActivity.this,

"选择图片文件错", Toast.LENGTH_LONG);

return;

}

}

上述代码在大部分手机中可运行,但也遇到特殊情况。比如小米手机,在调用

photoUri = this.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

预先往图片库插入数据时,报错,提示unable to create new file。

java.lang.IllegalStateException: Unable to create new file: /storage/sdcard0/DCIM/Camera/1406856476247.jpg
at android.os.Parcel.readException(Parcel.java:1433)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420)
at android.content.ContentResolver.insert(ContentResolver.java:934)
at com.ivcar.weibo.ui.send.WriteWeiboActivity.onClick(WriteWeiboActivity.java:173)

参考:http://stackoverflow.com/questions/13633308/android-contentresolver-insert-crashes-with-unable-to-create-new-file

(我已经加上了外置卡读写权限。)似乎小米有特殊的权限控制,这里一直没搞清楚。

这里我改用其它方法替代。

自定义图片存储路径并生成随机图片名,然后创建文件,生成URI,传个相机程序,以替代插入数据获取URI操作。

总结下,Android手机调用自带的照相机和图库程序

(1)调用android相册和相机的代码

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri); 
startActivityForResult(intent, 1);

(2 ) 调用图库程序

Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//调用android的图库
startActivityForResult(i, 2);

猜你喜欢

转载自blog.csdn.net/guankai1990/article/details/52151162
今日推荐