Android 调去照相程序拍照
2016-08-08 13:45
330 查看
和调用图库选择图片一样,调用相机程序拍照也是经常遇到的。
这里做个小总结:
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);
这里做个小总结:
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);
相关文章推荐
- 基于Android的 拍照上传 程序开发
- android -调用系统的拍照程序
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android] 【转】
- 利用Camera API实现自己的拍照和摄像程序——android开发
- android 使用系统照相程序照相并存储、显示在界面上
- Android拍照上传程序的xml配置文件
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- Android获取图片资源之——拍照后在程序中显示照片
- Android获取图片资源之——拍照后在程序中显示照片
- 在android中用opencv实现拍照,存储照片的程序源代码
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- Android如何调用拍照程序实现连拍
- Android中如何调用照相程序
- android中的照相机机拍照程序(含连续拍照)
- 【转】 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- Android在程序中启动拍照/摄像或选择一张图片/视频,并制作缩略图后保存
- Android获取图片资源之——拍照后在程序中显示照片
- 基于Android的拍照上传程序开发