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

您可能感兴趣的文章:

  • Android实现从本地图库/相机拍照后裁剪图片并设置头像
  • Android实现用户头像更换操作
  • Android获取联系人头像的方法
  • Android中使用CircleImageView和Cardview制作圆形头像的方法
  • Android使用CircleImageView实现圆形头像的方法
  • Android实现个人资料页面头像背景模糊显示包(状态栏)
  • Android实现调用系统图库与相机设置头像并保存在本地及服务器
(0)

相关推荐

  • Android使用CircleImageView实现圆形头像的方法

    有时我们在应用中会用到圆形头像,下面是利用CircleImageView实现圆形头像的演示,下面效果和代码,效果如图 实现起来也比较简单,先在项目中建一个circleimageview包用来存放CircleImageView类,待会直接把CircleImageView类复制到包里就可以使用了 然后,再建一个attrs.xml,其代码相当简单,定义了圆形边框宽度和颜色 <?xml version="1.0" encoding="utf-8"?> <r

  • Android实现用户头像更换操作

    你以为头像更换很容易?或许对于用户来讲,在微信上更换一个头像只是点击头像,选择拍照或相册,裁剪返回而已.但是对于程序员来说,要实现其实也挺吃力的(小火柴花了一个下午整理~_~). 正如用户使用那样,代码的实现也是按照操作的顺序而逐步展开.如下图: 接下来主要来讲解一下代码: 1. 弹框选择相册或拍照 比较简单的方式就是直接使用AlertDialog弹出选项供用户进行选择 public static void showImagePickDialog(final Activity activity)

  • Android实现个人资料页面头像背景模糊显示包(状态栏)

    最近要实现这样一个效果,然后拿出来与大家分享一下主要的几段代码,希望大家能够用到,与人方便自己方便嘛! 首先: 要实现的是浮动状态栏效果,通过在Activity的onCreate方法中调用这个方法,然后就可以让整个布局浮现在整个手机屏幕之下了,这是我觉着最简单的一种方法了. public static void alphaTask(Activity context) { context.getWindow().requestFeature(Window.FEATURE_NO_TITLE); if

  • Android中使用CircleImageView和Cardview制作圆形头像的方法

    圆形头像在我们的日常使用的app中很常见,因为圆形的头像比较美观. 使用圆形图片的方法可能有我们直接将图片裁剪成圆形再在app中使用,还有就是使用自定义View对我们设置的任何图片自动裁剪成圆形. 效果图: 这里使用github上CircleImageView github:https://github.com/hdodenhof/CircleImageView CardView顾名思义卡片式的View,CardView继承的是FrameLayout,所以摆放内部控件的时候需要注意一下 可以设置

  • Android获取联系人头像的方法

    本文实例讲述了Android获取联系人头像的方法.分享给大家供大家参考,具体如下: public byte[] getPhoto(String people_id) { String photo_id = null; String selection1 = ContactsContract.Contacts._ID + " = " + people_id; Cursor cur1 = getContentResolver().query( ContactsContract.Contac

  • Android实现调用系统图库与相机设置头像并保存在本地及服务器

    废话不多说了,直接给大家贴代码了,具体代码如下所述: /** * 1.实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求 * 2.使用了picasso框架以及自定义BitmapUtils工具类 * 3.记得加上相关权限 * <uses-permission android:nam

  • Android实现从本地图库/相机拍照后裁剪图片并设置头像

    玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片.上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像.为了大家需要,下面我们小编把完整的代码贴出来供大家参考. 先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.co

  • 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_C

  • Android项目实战之Glide 高斯模糊效果的实例代码

    核心需要高斯模糊的库 compile 'jp.wasabeef:glide-transformations:2.0.1' 针对于3.7的版本 使用方法为: //加载背景, Glide.with(MusicPlayerActivity.this) .load(service.getImageUri()) .dontAnimate() .error(R.drawable.no_music_rotate_img) // 设置高斯模糊,模糊程度(最大25) 缩放比例 .bitmapTransform(n

  • Android项目实战之百度地图地点签到功能

    前言:先写个简单的地点签到功能,如果日后有时间细写的话,会更加好好研究一下百度地图api,做更多逻辑判断. 这里主要是调用百度地图中的场景定位中的签到场景.通过官方文档进行api集成.通过GPS的定位功能,获取地理位置,时间,用户名进行存储.之后通过日历显示历史签到记录. 效果图: /**百度地图sdk**/ implementation files('libs/BaiduLBS_Android.jar') /**日历选择器**/ implementation 'com.prolificinte

  • Android项目实战之ListView悬浮头部展现效果实现

    目录 实现效果: 我们先分析要解决的问题: 解决: 代码实现: 总结 实现效果: 先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个界面头部. 我们先分析要解决的问题: 1.如何实现列表ListView顶部视图跟随ListView一起滑动 2.如何实现滑动过程中需要停留在顶部的视图 解决: 第一个问题,实现ListView与顶部视图一起滑动,ListView提供一个方法,addHeadView(View); 意思就是在ListView

  • Android项目实战(二十八):使用Zxing实现二维码及优化实例

    前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的jar包,使用简化版的即可,下文可见. 这篇文章讲述: 1.如果快速在项目中集成zxing,实现扫描和生成二维码功能 2.根据项目需求去修改源码实现我们的要求并进行优化 一.快速集成zxing二维码 1.下载库文件 :http://xiazai.jb51.net/201611/yuanma/ZXingB

  • Android项目实战教程之高仿网易云音乐启动页实例代码

    前言 本文主要给大家介绍了关于Android高仿网易云音乐启动页的相关内容,这一节我们来讲解启动界面,效果如下: 首次创建一个SplashActivity用来做启动界面,因为创建完项目默认是MainActivity做主界面,所以需要去掉,将启动配置到同时去掉SplashActivity,并且去掉SplashActivity的标题栏,同时还要设置为全屏. Activity启动配置 在清单文件将启动配置剪贴到SplashActivity: <activity android:name=".ac

  • Android项目实战之仿网易顶部导航栏效果

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要显示的内容太多,而且又想在主页面全部显示出来,所以有加了顶部导航栏,但是Android这样的移动设备内存是受限的,那么多界面缓存到内存中,很容易导致内存溢出,这个是比较致命的,所以不得不考虑.虽然我在之前也做过网易的顶部导航栏但是方式并不好,就像使用viewpager做一些复杂的界面由于图片占用内存过多,很容易导致内存溢出,学习了今天的内容大家做一下对比相信

  • Android项目实战之仿网易新闻的页面(RecyclerView )

    本文实例实现一个仿网易新闻的页面,上面是轮播的图片,下面是 RecyclerView 显示新闻列表,具体内容如下 错误方法 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...> <ViewPager ... /> <android.support.v7.widget.RecyclerView .../> </LinearLayout> 这样布局

  • Android项目实战手把手教你画圆形水波纹loadingview

    本文实例讲解的是如何画一个满满圆形水波纹loadingview,这类效果应用场景很多,比如内存占用百分比之类的,分享给大家供大家参考,具体内容如下 效果图如下: 预备的知识: 1.贝塞尔曲线    如果你不了解,可以来这里进行基础知识储备:神奇的贝塞尔曲线 2.Paint.setXfermode()  以及PorterDuffXfermode 千万不要被这个b的名字吓到,不熟悉看到可能会认为很难记,其实 只要站在巨人的丁丁上 还是很简单的. 好了 废话不多说 ,跟我一步步来做一个炫酷的view吧

  • Spring Boot集成Swagger2项目实战

    一.Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持,这篇文章我们继续讨论这个话题,不过,我们这里不再讨论Restful API如何实现,而是讨论Restful API文档的维护问题. 在日常的工作中,我们往往需要给前端(WEB端.IOS.Android)或者第三方提供接口,这个时候我们就需要给他们提供一份详细的API说明文档.但维护一份详细的文档可不是一件简单的事情.首先,编写一份详细的文档本身就是一件很费时费力的事情,另一方面,由于代码和文档是分离的,所

随机推荐