一.图像选择
1.1目标
1 .出现了实现如图所示功能的:相册和照相机的选择
2 .可以修剪所选图像
1.2功能实现
1.2.1互联网工具类软件包
封装图像选择和图像裁剪的工具类
//*
选择照片(来自相册或相机) ) ) ) ) ) )。
* @param uri相机存储uri
* @return
*/
publicstaticintentgetphotoselectintent (uri uri ) {
intent take=new intent (mediastore.action _ image _ capture;
take.add category (intent.category _ default;
take.put extra (mediastore.extra _ output,uri );
intent pics=new intent (intent.action _ pick,mediastore.images.media.external _ content _ u u uri );
intent chose=intent.create chooser (pics,'选择图像');
chose.put extra (intent.extra _ initial _ intents,new Parcelable[]{take} );
返回选择;
}
//*
*图像裁剪
* @需要* @param inputUri修剪的图像
* @param outputUri修剪后的子库存
* @param width修剪宽度
* @param height裁剪高度
* @return
*/
publicstaticintentgetimagecropintent (uriinputuri,Uri outputUri,int width,int height ) {
intent intent=new intent (com.Android.camera.action.crop );
intent.setdataandtype(inputuri,' image/* ';
//以下crop=true允许视图修剪,以在打开的Intent中设置显示
intent.putextra('crop ',' true ' );
intent.putextra('scale ',true ); //去黑边
intent.put extra (scaleupifneeded )、true; //去黑边
//aspectX aspectY剪裁框的高度比率
intent.putextra(AspectX )、width ); //输出为x方向的比例
intent.putextra(aspecty )、height );
//outputX outputY输出图像的宽度较大,请不要更改以下数字。 卡住了
intent.putextra('outputx ',width ); //输出x方向像素
intent.putextra('outputy ',height );
intent.putextra('outputformat ',bitmap.compress format.JPEG.tostring ) );
intent.put extra (' no face detection ',true );
intent.put extra (mediastore.extra _ output,outputUri );
intent.putextra('return-data ',false ); //设定为不返回数据
返回英特尔;
}
1.2.2添加点击图片选择事件
b.ivAvatar.setOnClickListener {
mtakephotofile=file (get picpath (file.separatorsystem.current time millis ().jpeg ) ) )。
val uri=uri.from file (mtakephotofile ) )。
startactivityforresult (intent utils.getphotoselectintent (uri ),TAKE_PHOTO_REQ ) )
}
1.2.3图像选择和修整反馈的处理
剪切图像所需的Uri类似于content://的形式,因此需要封装获取content Uri的工具类
publicstaticurigetcontenturi (上下文上下文,文件文件) {
string file path=file.getabsolutepath (;
cursor cursor=context.get content resolver (
mediastore.images.media.external _ content _ uri,
new string [ ] { mediastore.images.media._ id },
MediaStore.Images.Media.DATA '=?' ,
new string [ ] {文件路径},null;
if(cursor!=null cursor.moveToFirst (
intid=cursor.getint(cursor
. getcolumn index (mediastore.media columns._ id );
uribaseuri=uri.parse (' content ://media/external/images/media );
返回uri.withappendedpath (base uri,' ' id );
} else {
if(file.exists () ) )。
contentvaluesvalues=new content values (;
values.put (mediastore.images.media.data,filePath );
返回上下文. get content resolver ()
mediastore.images.media.external _ content _ uri,values;
} else {
返回空值;
}
}
}
处理反馈结果
overridefunonactivityresult (请求代码: int,结果代码: int,数据: intent? () )。
super.onactivityresult (请求代码,结果代码,数据) )。
结果代码!=-1 ()
返回
}
when (请求代码) {
TAKE_PHOTO_REQ - {
//处理图像选择结果
mut photo file=file (get picpath (file.separator ' avatar _ ' system.current time millis ) ' jpeg ' ) ) )。
valcuturi=uri.from file (mcutphotofile ) )。
IF (数据!=空) {
startactivityforresult (intent utils.getimagecropintent (data.data,cutUri,200,200 ),CUT_PHOTO_REQ ) )。
} else {
val uri=uri utils.get content uri (应用程序上下文,mTakePhotoFile ) )。
startactivityforresult (intent utils.getimagecropintent (uri,cutUri,200,200 ),CUT_PHOTO_REQ )。
}
}
CUT_PHOTO_REQ - {
//处理图像裁剪结果
}
}
}
1.2.4安卓7.0兼容
1. res/xml/provider_paths.xml路径的自交换
2. manifests配置包名称由自己更换
.
Android : name=' Android.support.v4.content.file provider '
安卓: authorities=' com.example.sun moon.provider '
安卓: exported=' false '
Android : granturipermissions=' true '
Android : name=' Android.support.file _ provider _ paths '
Android : resource=' @ XML/provider _ paths ' /
.
.
总结
以上是编辑向大家介绍的安卓项目实战头像选择功能。 我希望对大家有帮助。 如果大家有什么疑问的话请给我留言。 编辑马上回复大家。 在此也感谢您对脚本房屋网站的支持!