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);}
}
android 上传头像遇到的问题,Android 7.0 图片剪切问题,选择头像上传相关推荐
- ios图片剪切之圆形头像
1 #import <UIKit/UIKit.h> 2 3 @interface UIImage (NJ) 4 /** 5 * 生成头像 6 * 7 * @param icon 头像图片名 ...
- Django之头像实时展示到input框、图片验证码、简单发邮件
一.以注册功能来看头像实时展示 首先先来写一个简单的页面: <div class="container-fluid"><div class="row&q ...
- Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例)
Android实现注册登录头像上传等功能常规开发(Android端,服务器端开发实例) 标签: 注册登录Android开发servlet 2017-04-18 20:34 454人阅读 评论(1) ...
- 移动端上传大文件到服务器,android上传大文件到服务器地址
android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...
- android上传文件至服务器(android端+服务器端)
引言:本来android文件上传的博客在网上挺多的,不过好些都只是有前台android端的上传,并没有后台服务器端的接收.而且自己写的时候也确实遇见了一些之前没注意到的地方,写出来也算是给自己提个醒. ...
- 微信小程序/网页/app/android等各种bar图标导航图标文章图标标题图标下拉/检索收藏上传客服等图标整理
在做微信小程序的时候,需要给底部放置图标.但是找了好久都没有找到自己想要的,适合的.后来我就把所有的小程序的图标都看了下.后来想想还是整理出来,方便自己以后用,也方便大家一下.我敢保证有你想要的,适合 ...
- Android实现换发型功能,实现一个Android中更换头像功能
实现一个Android中更换头像功能 本文原创,转载请经过本人准许 写在前面: 更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置. 功能 ...
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
在之前一篇博文中<< Android中View绘制流程以及invalidate()等相关方法分析>> ,简单的阐述 了 Android View 绘制流程的三个步骤,即: 1. ...
- Android群英传笔记——第十章:Android性能优化
Android群英传笔记--第十章:Android性能优化 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质 ...
最新文章
- 惊!!!CV界的BERT要来了?准确率提高近25%!
- 水星逆行,诸事不宜,瞬间爆炸。
- C 语言中结构体强制转换--实验
- Javascript的IE跟Firefox(火狐)兼容性-转
- 常见的社会潜规则有哪些?
- 2013计算机视觉代码合集一
- java jsp导出pdf文件_JSP页面导出PDF格式文件
- PHP错误类型及屏蔽方法
- Python将函数作为闭包
- 干货:不同场景容器内获取客户端源IP的方法
- SQLite第九课 sqlite3_set_authorizer案例
- java经典算法(六)---zws
- 此加载项为计算机上的所有用户安装但只能,win7系统控件无法安装的解决方法...
- idea关闭自动更新
- Windows Server2012 安装升级补丁更新
- 从三个维度分析DeFi连环清算问题的解决方案 | 链捕手
- Qt5学习之路及嵌入式开发教程1:信号槽例子
- centos 安装gcc9及配置
- 【读书笔记】《利用Python进行数据分析》第2版_第六章 数据载入、存储及文件格式
- Gzip Zlib PNG 压缩算法【转】
热门文章
- ASP.NET服务器控件数据绑定总结
- linux nc命令用法举例
- Linux nginx搭建文件服务器
- Python Django后台管理模板美化:使用django-simpleui模块
- zk的数据目录:`version-2`
- ubuntu/deepin常用软件清单(都是使用sudo apt-get install安装方式)
- vshpere esxi6.7安装
- 大数据容器化-基于Kubernetes(k8s)构建spark运行环境
- C语言指针:定义,使用及计算指针大小
- 【代码】CyclicBarrier栅栏使用示例