android sdk拍照,Android SDK4/5/6/7,相册、拍照及裁剪功能及遇见的坑

保存照片和视频到系统相册显示- http://blog.csdn.net/chendong_/article/details/52290329

Android 7.0 之拍照与图片裁剪适配-http://blog.csdn.net/yyh352091626/article/details/54908624

看似简单的问题,在各个厂商手机上有不同的问题,请广而测之,

> 方案如下:将中间数据先暂存一下,然后再调裁剪Intent,最后把结果存在Uri中。

//打开相册

public void openAlbum() {

Intent intent;

if (Build.VERSION.SDK_INT < 19) {

intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("image/*");

} else {

intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

}

startActivityForResult(intent, PHOTO_REQUEST_ALBUM);

}

private File mPhotoFile;

//打开相机

private void openCamera(File out) {

LogUtil.e("openCamera", "mPhotoFile=" + mPhotoFile.toString());

// Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

try {

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out)); // set

// intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);

startActivityForResult(intent, PHOTO_REQUEST_CAREMA);

} catch (Exception e) {

e.printStackTrace();

ToastUtil.showLongToast(mContext,"当前无拍照权限,请在 设置-> 应用权限-> "+ mContext.getString(R.string.app_name)+"-> 权限-> 打开相机权限","");

} finally {

}

}

private intPHOTO_REQUEST_CAREMA= 1001;// 拍照private intPHOTO_REQUEST_ALBUM= 1002;// 从相册中选择private intPHOTO_REQUEST_CUT= 1003;

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

super.onActivityResult(requestCode, resultCode, data);

LogUtils.e("onActivityResult","exe onActivityResult()");

String picPath = null;

if(resultCode == RESULT_OK) {

if(requestCode == PHOTO_REQUEST_ALBUM) {// 相册Uri selectedImage = data.getData();

if(data != null) {

Uri uri = data.getData();

crop(uri);

filePath= getRealPathFromURI(uri);

LogUtils.e("onActivityResult","filePath="+filePath);

}

LogUtil.e("onActivityResult", "相册 picPath= empty");

} else if(requestCode == PHOTO_REQUEST_CAREMA) {// 拍照if(mPhotoFile!= null&& mPhotoFile.exists()) {

crop(Uri.fromFile(mPhotoFile));

filePath= mPhotoFile.toString();

LogUtils.e("onActivityResult","filePath="+filePath);

}

} else if(requestCode == PHOTO_REQUEST_CUT) {

Uri uri = data.getData();

LogUtils.e("PHOTO_REQUEST_CUT", "uri="+ uri);

if(uri != null) {

if(uri.toString().contains("content://")) { //如果包含有content开头,需要转化为其实际路径,不能用content开头filePath= getRealPathFromURI(uri);

} else{

filePath= uri.toString(); //如果用file开头,不用转化}

LogUtils.e("PHOTO_REQUEST_CUT", "filePath="+ filePath);

uploadAvatar();

} else{

uploadAvatar();

// ToastUtil.showShortToast(NyApplication.getInstance(), R.string.dataError);}

}

}

}

//裁剪图

private void crop(Uri uri) {

// 裁剪图片意图

Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(uri, "image/*");

intent.putExtra("crop", "true");

// 裁剪框的比例,1:1

intent.putExtra("aspectX", 1);

intent.putExtra("aspectY", 1);

// 裁剪后输出图片的尺寸大小

intent.putExtra("outputX", 250);

intent.putExtra("outputY", 250);

// 图片格式

intent.putExtra("outputFormat", "JPEG");

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

intent.putExtra("noFaceDetection", true);// 取消人脸识别

intent.putExtra("return-data", false);// true:不返回uri,false:返回uri

startActivityForResult(intent, PHOTO_REQUEST_CUT);

}

/**

* 传入Uri,得到图片的真实路径

*

* @param contentUri

* @return

*/

private String getRealPathFromURI(Uri contentUri) { //传入图片uri地址

String picPath = null;

String[] filePathColumn = {MediaStore.Images.Media.DATA};

Cursor cursor = null;

cursor = mContext.getContentResolver().query(contentUri,

filePathColumn, null, null, null);

if (cursor != null && cursor.moveToFirst()) {

int columnIndex = cursor

.getColumnIndex(filePathColumn[0]);

picPath = cursor.getString(columnIndex);

cursor.close();

}

return picPath;

}

Htc提示SD卡已满 Android -- https://zhidao.baidu.com/question/1048799384918824739.html

https://zhidao.baidu.com/question/2202745883929714388.html

publicString getRealFilePath( finalContext context, finalUri uri ) {

if( null== uri ) return null;

finalString scheme = uri.getScheme();

String data = null;

if( scheme == null)

data = uri.getPath();

else if( ContentResolver.SCHEME_FILE.equals( scheme ) ) {

data = uri.getPath();

} else if( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {

Cursor cursor = context.getContentResolver().query( uri, newString[] { MediaStore.Images.ImageColumns.DATA}, null, null, null);

if( null!= cursor ) {

if( cursor.moveToFirst() ) {

intindex = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA);

if( index > -1 ) {

data = cursor.getString( index );

}

}

cursor.close();

}

}

returndata;

}

/*** 根据图片FileUrl路径获取ContentUri**@param*@param*@return*/publicUri convertFileToUri(Context context, File imageFile) {

String filePath = imageFile.getAbsolutePath();

Cursor cursor = context.getContentResolver().query(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

newString[]{MediaStore.Images.Media._ID},

MediaStore.Images.Media.DATA+ "=? ",

newString[]{filePath}, null);

if(cursor != null&& cursor.moveToFirst()) {

intid = cursor.getInt(cursor

.getColumnIndex(MediaStore.MediaColumns._ID));

Uri baseUri = Uri.parse("content://media/external/images/media");

returnUri.withAppendedPath(baseUri, ""+ id);

} else{

if(imageFile.exists()) {

ContentValues values = newContentValues();

values.put(MediaStore.Images.Media.DATA, filePath);

returncontext.getContentResolver().insert(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

} else{

return null;

}

}

}

图片路径URL与URI的相互转化???

>>> Android7.0 拍照及裁剪的坑

Android7.0适配心得-- http://www.tuicool.com/articles/zYniuyZ   ,   http://stackoverflow.com/questions/7305504/convert-file-uri-to-content-uri

> error:No such file or directory,java.io.UnixFileSystem.createFileExclusively0,文件夹目录需要先创建,然后再在相应的文件夹目录下创建文件

File f = new File("somedirname1/somedirname2/somefilename");

if (!f.getParentFile().exists())

f.getParentFile().mkdirs();//创建文件夹

if (!f.exists())

f.createNewFile();//创建文件

--------------------------------------------------

File appDir = newFile(Environment.getExternalStorageDirectory().getAbsolutePath(), filePath);

if(!appDir.exists()) {

appDir.mkdir();

}

File dir = newFile(appDir, formatCurrentDate("yyyy_MM_dd_HH_mm_ss") + ".jpg");

// dir.delete();// if (!dir.exists()) {// try {// dir.createNewFile(); } catch (IOException e) {// e.printStackTrace();// }// LogUtils.e("CommonUtils", "success createFile dir=" + dir.toString());// return dir;// } else {// LogUtils.e("CommonUtils", "success createFile dir=" + dir.toString());// return dir;// }if(!dir.exists()) {

try{

if(!dir.getParentFile().exists()){

dir.getParentFile().mkdirs();

}

if(!dir.exists()){

dir.createNewFile();

}

} catch(IOException e) {

e.printStackTrace();

}

LogUtils.e("CommonUtils", "success createFile dir="+ dir.toString());

returndir;

} else{

LogUtils.e("CommonUtils", "success createFile dir="+ dir.toString());

returndir;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值