一、 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);}
}