发表于: 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
从相册选取图片
评论