android 上传头像遇到的问题,Android 7.0 图片剪切问题,选择头像上传

一、 7.0文件地址传输的问题

异常信息:FileUriExposedException:

android:name="android.support.v4.content.FileProvider"android:authorities="应用报名.fileProvider"android:exported="false"android:grantUriPermissions="true">android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/>

在res.下的xml文件:

文件名是:file_paths(和清单文件中一致)

xml version="1.0"encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android">name="files_root"path="Android/data/com.lechuang.letaotao/"/>name="external_storage_root"path="."/>

在 传输过程中提供图片地址:

public staticUri getUriForFile(Context context,File file) {

if(context == null|| file == null) {

throw newNullPointerException();}

Uri uri;if(Build.VERSION.SDK_INT>= 24) {

uri = FileProvider.getUriForFile(context,"应用包名.fileProvider",file);} else{

uri = Uri.fromFile(file);}

returnuri;}

打开照相机:

//android 7.0// Uri imageUri = FileProvider.getUriForFile(mContext, "应用包名.fileProvider", file);

// 7.0 以

// Uri uri = Uri.fromFile(file);

//适配7.0和7.0一下的地址Uri imageUri =

getUriForFile(

mContext

,

file)

;Intent intent =

newIntent()

;intent.addFlags(Intent.

FLAG_GRANT_READ_URI_PERMISSION)

;intent.setAction(MediaStore.

ACTION_IMAGE_CAPTURE)

;intent.putExtra(MediaStore.

EXTRA_OUTPUT

,imageUri)

; //把拍照后的图片放在指定的文件intent.putExtra(MediaStore.

EXTRA_VIDEO_QUALITY

,

0)

;startActivityForResult(intent

,

2)

;

相册选择:

Intent intent = newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*"); //*代表全部startActivityForResult(intent,1);

裁剪图片:

public static voidresizeImage(Uri uri,Activity activity, intrequestCode) {

Intent intent = newIntent("com.android.camera.action.CROP");intent.setDataAndType(uri,"image/png"); //限定图片类型intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //重要 ,权限要求。intent.putExtra("crop","true");

// aspectX , aspectY :宽高的比例intent.putExtra("aspectX",1);intent.putExtra("aspectY",1);

// outputX , outputY : 裁剪图片宽高intent.putExtra("outputX",150);intent.putExtra("outputY",150);intent.putExtra("return-data", true);activity.startActivityForResult(intent,requestCode);}

压缩图片:

private voidshowResizeImage(Intent data) {

Bundle extras = data.getExtras();if(extras != null) {

Bitmap bitmap = extras.getParcelable("data");String path = Uri.fromFile(file).getPath();bitmap =toSmall(bitmap,path);

}

}

压缩处理的具体方法:

public staticBitmap toSmall(Bitmap bitmap,String path) {

intscale = 1;intwidth_tmp = bitmap.getWidth();intheight_tmp = bitmap.getHeight();while(true) {

if(width_tmp / 2< 100|| height_tmp / 2< 100)

break;width_tmp /= 2;height_tmp /= 2;scale *= 2;}

Matrix matrix = newMatrix();matrix.postScale(scale,scale);// 长和宽放大缩小的比例bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix, true);try{

FileOutputStream fileOutputStream = newFileOutputStream(path);try{

bitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);} finally{

try{

fileOutputStream.flush();fileOutputStream.close();} catch(IOException e) {

}

}

} catch(FileNotFoundException e) {

e.printStackTrace();}

returnbitmap;}

主界面的处理:

@Overridepublic voidonActivityResult(intrequestCode, intresultCode,Intent data) {

switch(requestCode) {

case1:

if(resultCode != -1) {

return;}

.resizeImage(data.getData(), this,3); //处理从相册返回的信息:break;case2:

if(resultCode != -1) {

return;}

if(PhotoUtil.isSdcardExisting()) { //处理从照相机返回的图片

Uri uriForFile = getUriForFile(mContext,file);resizeImage(uriForFile, this,3); //开始裁剪} else{

Utils.show(mContext,"未找到存储卡,无法存储照片");}

break;case3:

if(data != null) {

showResizeImage(data); // 压缩图片}

break;default:

break;}

super.onActivityResult(requestCode,resultCode,data);}

附 Android6.0 文件和照相机权限申请:

private static final intREQUEST_PERMISSION_CAMERA= 222;private static final intREQUEST_PERMISSION_STORAGE= 333;private voidsetCamear() {

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M) {

intcheckCallPhonePermission = ContextCompat.checkSelfPermission(mContext,Manifest.permission.CAMERA);if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(this, newString[]{Manifest.permission.CAMERA},REQUEST_PERMISSION_CAMERA);return;}

}

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M) {

intcheckCallPhonePermission = ContextCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE);if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(this, newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_STORAGE);return;}

}

}

@Overridepublic voidonRequestPermissionsResult(intrequestCode,String[] permissions, int[] grantResults) {

switch(requestCode) {

//就像onActivityResult一样这个地方就是判断你是从哪来的。caseREQUEST_PERMISSION_CAMERA:

if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {

} else{Utils.show(mContext,"很遗憾你把相机权限禁用了!");finish();}

break;caseREQUEST_PERMISSION_STORAGE:

if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {

} else{

// Permission DeniedUtils.show(mContext,"很遗憾你把读取文件权限禁用了!");finish();}

break;default:

super.onRequestPermissionsResult(requestCode,permissions,grantResults);}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值