和调用图库选择图片一样,调用相机程序拍照也是经常遇到的。
这里做个小总结:
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)
(我已经加上了外置卡读写权限。)似乎小米有特殊的权限控制,这里一直没搞清楚。
这里我改用其它方法替代。
自定义图片存储路径并生成随机图片名,然后创建文件,生成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);