发表于: 2018-10-18 23:01:39

0 803


一、今天完成的事情

     1.  使用CircleImageView来显示圆形头像,上传用户设置的个人信息(包括头像)。

       CircleImageView是GitHub上的一个开源控件,使用方法非常简单,首先添加依赖

      implementation 'de.hdodenhof:circleimageview:2.2.0'

      之后再XML文件中直接使用就行了

        <de.hdodenhof.circleimageview.CircleImageView

                xmlns:app="http://schemas.android.com/apk/res-auto"

                android:id="@+id/civ_head"

                android:layout_width="30dp"

                android:layout_height="30dp"

                android:src="@drawable/head"

                app:civ_border_width="2dp"

                app:civ_border_color="#000000" />

        别的属性都好理解,app:civ_border_width设置的是头像周围边框的宽度,默认没有,app:civ_border_color设置的是边框的颜色。使用时有一个要注意的地方,它的scaleType属性只能设为CENTER_CROP,不然会报错,源码我还没看,有时间看一下。


       2.从相册选择图片

         首先还是要申请读写SD卡的权限WRITE_EXTERNAKL_STORAGE

if (ContextCompat.checkSelfPermission(MyInfoActivity.this,
       Manifest.permission.WRITE_EXTERNAL_STORAGE)
       != PackageManager.PERMISSION_GRANTED) {
   ActivityCompat.requestPermissions(MyInfoActivity.this,

       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

} else {

   openAlbum();
}
private void openAlbum() {
   Intent intent = new Intent("android.intent.action.GET_CONTENT");
   intent.setType("image/*");
   startActivityForResult(intent, CHOOSE_PHOTO); //CHOOSE_PHOTO为2
}

        然后通过Intent调用satrtActivityForResult()方法打开相册选择照片,选完照片后回到onActivityResult()方法处理照片,为了向下兼容,4.4以上的系统(包含4.4)调用handleImageOnKitKat()方法来处理,4.4以下 的调用handleImageBeforeKitKat来处理,因为从4.4开始,选取图片后返回的是封装过的的Uri,需要对其进行解析,而在4.4之前,返回的uri是没有封装的,可以直接用getImagePath()方法获取图片的真实路径。

/*
Android_4.4以上系统
*/
private String handleImageOnKitKat(Intent data) {
   String imagePath = null;
   Uri uri = data.getData();
   if (DocumentsContract.isDocumentUri(this, uri)) {
       //如果是document类型的uri,通过document id来处理
       String docId = DocumentsContract.getDocumentId(uri);
       if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
           //解析出数字格式id
           String id = docId.split(":")[1];
           String selection = MediaStore.Images.Media._ID + "=" + id;

           imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI

               selection);

       } else if ("com.android.providers.downloads.document".equals(uri.getAuthority())) {
           Uri contentUri = ContentUris.withAppendedId(Uri.parse(
                 "content://downloads/public_downloads"), Long.valueOf(docId));
           imagePath = getImagePath(contentUri, null);
       }
   } else if ("content".equalsIgnoreCase(uri.getScheme())) {
       //如果是content类型的uri,则用普通方式处理
       imagePath = getImagePath(uri, null);
   } else if ("file".equalsIgnoreCase(uri.getScheme())) {
       //如果是file类型的uri,直接获取图片路径即可
       imagePath = uri.getPath();
   }
    return imagePath;
}
/*
Android_4.4以下的系统
*/
private String handleImageBeforeKitKat(Intent data) {
   Uri uri = data.getData();
   String imagePath = getImagePath(uri, null);
   return imagePath;
}

private String getImagePath(Uri uri, String selection) {
    String path = null;
   //通过Uri和selection来获取图片的真实路径
   Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
   if (cursor != null) {
      if (cursor.moveToFirst()) {
         path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
       }
       cursor.close();
   }
   return path;
}

        获取到图片后除非对图片质量有要求,不然最好压缩一下再加载到内存中进行下一步处理。


二、明天计划的事情

     完成任务四

     

三、遇到的问题

       上传Date到Bmob云数据库时,凡是日期在1980年5月1日之前的,数据库里显示的日期都要比原先少1个小时,1980年5月1日往后的都没有问题。


四、收获

    CircleImageView

     从相册选取图片



返回列表 返回列表
评论

    分享到