这期内容当中小编将会给大家带来有关Android中怎么实现一个头像选择功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
封装图片选择和图片裁剪的工具类
/**
* 选择图片(从相册或相机)
* @param uri 相机存储uri
* @return
*/
public static Intent getPhotoSelectIntent(Uri uri){
Intent take = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
take.addCategory(Intent.CATEGORY_DEFAULT);
take.putExtra(MediaStore.EXTRA_OUTPUT, uri);
Intent pics = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Intent chose= Intent.createChooser(pics,"选择图片");
chose.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{take});
return chose;
}
/**
* 图片裁剪
* @param inputUri 需要裁剪的图片
* @param outputUri 裁剪后存储位置
* @param width 裁剪宽度
* @param height 裁剪高度
* @return
*/
public static Intent getImageCropIntent(Uri inputUri, Uri outputUri, int width, int height) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(inputUri, "image/*");
// 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", "true");
intent.putExtra("scale", true); // 去黑边
intent.putExtra("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.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.putExtra("return-data", false); // 设置为不返回数据
return intent;
}
b.ivAvatar.setOnClickListener {
mTakePhotoFile = File(getPicPath() + File.separator + System.currentTimeMillis() + ".jpeg")
val uri = Uri.fromFile(mTakePhotoFile)
startActivityForResult(IntentUtils.getPhotoSelectIntent( uri), TAKE_PHOTO_REQ)
}
图片裁剪所需的Uri类似: content:// 的形式,因此需要封装一个获取content Uri的工具类
public static Uri getContentUri(Context context, File file) {
String filePath = file.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (file.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
处理反馈结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode != -1) {
return
}
when (requestCode) {
TAKE_PHOTO_REQ -> {
// 处理图片选择结果
mCutPhotoFile = File(getPicPath() + File.separator + "avatar_" + System.currentTimeMillis() + "jpeg")
val cutUri = Uri.fromFile(mCutPhotoFile)
if (data != null){
startActivityForResult(IntentUtils.getImageCropIntent(data.data, cutUri, 200, 200), CUT_PHOTO_REQ)
} else {
val uri = UriUtils.getContentUri(applicationContext, mTakePhotoFile)
startActivityForResult(IntentUtils.getImageCropIntent(uri, cutUri, 200, 200), CUT_PHOTO_REQ)
}
}
CUT_PHOTO_REQ -> {
// 处理图片裁剪结果
}
}
}
1. res/xml/provider_paths.xml路径自行更换
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path path="Android/data/com/example/sunmoon/images" name="sdcard_files" />
<external-files-path path="Android/data/com/example/sunmoon/images" name="camera_has_sdcard"/>
<files-path path="Android/data/com/example/sunmoon/other" name="camera_no_sdcard"/>
<external-path path="Android/data/com/example/sunmoon" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
2. manifests配置包名自行更换
...
<application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.sunmoon.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
...
</application>
...
上述就是小编为大家分享的Android中怎么实现一个头像选择功能了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。