Android 7.0 图片剪切问题,选择头像上传
来源:互联网 发布:没有网络可以装监控吗 编辑:程序博客网 时间:2024/05/14 23:03
一、 7.0文件地址传输的问题
异常信息:FileUriExposedException:
<!-- android 7.0以上 --><provider android:name="android.support.v4.content.FileProvider" android:authorities="应用报名.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /></provider>
在res.下的xml文件:
文件名是:file_paths(和清单文件中一致)
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="files_root" path="Android/data/com.lechuang.letaotao/" /> <external-path name="external_storage_root" path="." /></paths>
在 传输过程中提供图片地址:
public static Uri getUriForFile(Context context, File file) { if (context == null || file == null) { throw new NullPointerException(); } Uri uri; if (Build.VERSION.SDK_INT >= 24) { uri = FileProvider.getUriForFile(context, "应用包名.fileProvider", file); } else { uri = Uri.fromFile(file); } return uri;}
打开照相机:
//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 = new Intent();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 = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); //*代表全部startActivityForResult(intent, 1);
裁剪图片:
public static void resizeImage(Uri uri, Activity activity, int requestCode) { Intent intent = new Intent("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 void showResizeImage(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 static Bitmap toSmall(Bitmap bitmap, String path) { int scale = 1; int width_tmp = bitmap.getWidth(); int height_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 = new Matrix(); matrix.postScale(scale, scale); // 长和宽放大缩小的比例 bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); try { FileOutputStream fileOutputStream = new FileOutputStream(path); try { bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); } finally { try { fileOutputStream.flush(); fileOutputStream.close(); } catch (IOException e) { } } } catch (FileNotFoundException e) { e.printStackTrace(); } return bitmap;}
主界面的处理:
@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode != -1) { return; } .resizeImage(data.getData(), this, 3); //处理从相册返回的信息: break; case 2: if (resultCode != -1) { return; } if (PhotoUtil.isSdcardExisting()) { //处理从照相机返回的图片 Uri uriForFile = getUriForFile(mContext, file); resizeImage(uriForFile, this, 3); //开始裁剪 } else { Utils.show(mContext, "未找到存储卡,无法存储照片"); } break; case 3: if (data != null) { showResizeImage(data); // 压缩图片 } break; default: break; } super.onActivityResult(requestCode, resultCode, data);}
附 Android6.0 文件和照相机权限申请:
private static final int REQUEST_PERMISSION_CAMERA = 222;private static final int REQUEST_PERMISSION_STORAGE = 333;private void setCamear() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int checkCallPhonePermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA); if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA); return; } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int checkCallPhonePermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_STORAGE); return; } }}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { //就像onActivityResult一样这个地方就是判断你是从哪来的。 case REQUEST_PERMISSION_CAMERA: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { Utils.show(mContext, "很遗憾你把相机权限禁用了!"); finish(); } break; case REQUEST_PERMISSION_STORAGE: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { // Permission Denied Utils.show(mContext, "很遗憾你把读取文件权限禁用了!"); finish(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); }}
阅读全文
0 0
- Android 7.0 图片剪切问题,选择头像上传
- Android 选择图片剪切上传
- android 选择头像上传
- android 选择图片拍照并剪切照片上传到服务器
- Android从相册选择一个图片、剪切、上传
- android圆形头像的选择和剪切并存储出圆形图片
- 会员中心上传头像时的,上传图片并剪切
- Android 上传头像自定义(剪切、平移,缩放)
- Android 圆形图像选择剪切并上传
- 多种方式选择剪切头像
- android 拍照和选择相册图片剪切
- Android头像(图片)上传/文件上传
- Android上传头像,图片剪裁,压缩图片
- Android上传头像,图片剪裁,压缩图片
- Android上传头像,图片剪裁,压缩图片
- 选择图片或拍照剪切后上传服务器
- Android开发之头像上传(包含拍照,从相册选择图片,裁剪等)
- 选择图片剪切功能
- 使用Python拉去服务器日志
- 数据泵调用的后台进程是什么
- 关键字this和$(this)的区别
- 友盟QQ第三方登陆
- Springboot-01-环境搭建
- Android 7.0 图片剪切问题,选择头像上传
- restful 接口设计要点记录
- 1835: [ZJOI2010]base 基站选址
- 分布式缓存技术redis学习系列----深入理解Spring Redis的使用
- 码云小课题 | 主流开源协议有哪些?我们该如何选择?
- missing_range
- python3.5学习笔记:linux6.4 安装python3 pip setuptools
- 我为什么那么喜欢《宫崎骏の电影》
- ifix5.8报警区域(报警组)