相册中的照片都是存储在external-storage,需要动态申请WRITE_EXTERNAL_STORAGE权限.
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},10);
public void onRequestPermissionsResult(int requestCode,String[] permissons,int[] grantResult){
switch(requestCode){
case 10:if(grantResult.length>0 && grantResult[0]==PackageManager.PERMISSION_GRANTED){
openAlbum();
}else{
Toast.makeText(MainActivity.this,"permission denied",Toast.LENGTH_SHORT).show();
}break;
default:;
}
}
记得在AndroidManifest声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>打开相册的逻辑:
public void openAlbum(){
Intent intent=new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,2);
}
Android4.4及其以上选择照片后,返回的是封装过的Uri,需要对Uri进行解析,4.4版本之前返回的Uri无需解析,可直接使用.
public void onActivityResult(int RequestCode,int ResultCode,Intent data){
switch(RequestCode){
case 2:if(ResultCode==RESULT_OK){
if(Build.VERSION.SDK_INT>=19){
handleImageOnKitKat(data);
}else{
handleImageBeforeKitKat(data);
}
}break;
default:;
}
}
handleImageOnKitKat的实现:
@TargetApi(19)
private void handleImageOnKitKat(Intent data){
String imagePath=null;
Uri uri=data.getData();
if(DocumentsContract.isDocumentUri(this,uri)){
String docId=DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
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.documents".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())){
imagePath=getImagePath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
imagePath=uri.getPath();
}
displayImage(imagePath);
}
先判断是document uri,content uri,还是file uri.
This will get the file path from the MediaProvider, DownloadsProvider, and ExternalStorageProvider.
然后通过getImagePath查询数据库,得到文件真实路径.
最后通过displayImage将图片加载到App中. 注意:@TargetApi(19)annotation is used to supress the Lint API check, so you wouldn't have a compile error.
handleImageBeforeKitKat的实现:
private void handleImageBeforeKitKat(Intent data){
String imagePath=null;
Uri uri=data.getData();
imagePath=getImagePath(uri,null);
displayImage(imagePath);
}
getImagePath的实现:
private String getImagePath(Uri uri,String selection){
String Path=null;
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;
}
displayImage的实现:
private void displayImage(String Path){
Bitmap bm=BitmapFactory.decodeFile(Path);
image.setImageBitmap(bm);
}