当前位置: 首页 > 编程笔记 >

Android 项目实战之头像选择功能

柴浩大
2023-03-14
本文向大家介绍Android 项目实战之头像选择功能,包括了Android 项目实战之头像选择功能的使用技巧和注意事项,需要的朋友参考一下

一、图片选择

1.1 目标

1.实现如图所示功能:能够出现相册和相机选项

2.能够对选择的图片进行裁剪

 

1.2 功能实现

1.2.1 Intent工具类封装

封装图片选择和图片裁剪的工具类

/**
  * 选择图片(从相册或相机)
  * @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;
 }

1.2.2 添加点击图片选择事件

b.ivAvatar.setOnClickListener {
   mTakePhotoFile = File(getPicPath() + File.separator + System.currentTimeMillis() + ".jpeg")
   val uri = Uri.fromFile(mTakePhotoFile)
   startActivityForResult(IntentUtils.getPhotoSelectIntent( uri), TAKE_PHOTO_REQ)
  }

1.2.3 处理图片选择和裁剪反馈

图片裁剪所需的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.2.4 Android 7.0适配

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 项目实战之头像选择功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 本文向大家介绍java商城项目实战之购物车功能实现,包括了java商城项目实战之购物车功能实现的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下 1 需要实现 1、实现淘淘商城的购物车功能 2 购物车功能 2.1 功能说明 1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。 2、计算购物车中商品的总

  • 我在这个问题上遇到了几个问题。我正在尝试选择运行Chrome的Android设备上的后置摄像头。 因此,在阅读之后: 然后,因为我用了三个。在这个应用程序中,我将这个ID绑定到Jerome Etienne三分机网络摄像头抓取(https://github.com/jeromeetienne/threex.webar): 然后我不得不修改3X。网络摄像头抓取以这种方式分类(我删除了不相关的部分):

  • 本文向大家介绍Ajax实现注册并选择头像后上传功能,包括了Ajax实现注册并选择头像后上传功能的使用技巧和注意事项,需要的朋友参考一下 在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册用户这一项,但是都忽略掉了一个功能,那就是,很多网站的注册是可以上传头像的,在这里我做了一个在已有的头像数组里选择图片上传作头像的小型crm(当然,可以从本地照片上传并裁剪的那种我还没做出来,不

  • 本文向大家介绍Android实现头像上传功能,包括了Android实现头像上传功能的使用技巧和注意事项,需要的朋友参考一下 之前做这个头像上传功能还是花了好多时间的,今天我将我的代码分享给大家先看效果图 首先看上传图片的工具类,一点都没有少复制就可以用 从相册获取图片的方法 从系统相机拍照获取照片 调用系统裁剪工具裁剪图片 上传服务器的方法 重新服务器响应方法 重写这些方法需要实现接口 重写onA

  • 本节将实现商城项目前台的购物车管理模块:添加、浏览、删除、修改和清空等购物车操作。 (1). 开发前的准备工作: 在数据库 shopdb 中已存在数据表goods,并且内有测试数据。 默认开启了session,并且执行了数据迁移,数据库中已存在django_session表。 在common应用目录中的myobject/common/models.py 模型文件中,已存在Goods模型类的定义。

  • 我试图让用户从JSF中的下拉列表中选择一个集合项。这是我正在使用的代码: 这是MyBean的代码: 如果需要,我的getter和setter为用户: 我的问题是,当它打印“所选用户是”时,没有写入用户。toString(),但用户列表。toString()!就像SelectOne菜单一样,它的设置不正确,但我已经搜索了很多。有人能帮忙吗?谢谢,安