一、工作流程
在主界面点击按钮,从相册中选择照片,在主界面中显示图片,如图:
二、编程思路
- 点击时,首先获取“sdcard”的读写权限
- 权限通过时,打开《相册》进行选择(系统会将选择到的图片以Uri封装,存入到intent对象中)
- 选择结束时,从intent中获取uri(intent.getData()), 再利用ContentResolver从uri中获取文件的绝对路径,最终显示到ImageView中。
三、目前的不足
- 没有做Android 4.4(API 18)以下的适配
- 没有考虑到用户从“相册”以外的选择文件的情况。
四、具体实现过程:
- 权限申请
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 动态权限申请
//按钮点击事件
public void select(View view) {
String[] permissions=new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//进行sdcard的读写请求
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,permissions,1);
}
else{
openGallery(); //打开相册,进行选择
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
openGallery();
}
else{
Toast.makeText(this,"读相册的操作被拒绝",Toast.LENGTH_LONG).show();
}
}
}
- 打开相册的处理
//打开相册,进行照片的选择
private void openGallery(){
Intent intent=new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,1);
}
- 相册选择完毕的处理
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
handleSelect(data);
}
}
//选择后照片的读取工作
private void handleSelect(Intent intent){
Cursor cursor=null;
Uri uri=intent.getData();
//如果直接是从"相册"中选择,则Uri的形式是"content://xxxx"的形式
if("content".equalsIgnoreCase(uri.getScheme())){
cursor= getContentResolver().query(uri,null,null,null,null);
if(cursor.moveToFirst()){
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String path=cursor.getString(columnIndex);
Bitmap bitmap= BitmapFactory.decodeFile(path);
photo.setImageBitmap(bitmap);
}
}
else{
Log.i("other","其它数据类型.....");
}
cursor.close();
}