package com.zjw.mymultimedia; import android.Manifest; import android.annotation.TargetApi; import android.content.ContentUris; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; //8.3.2 p298 从相册中选择照片 //主布局:一个button,一个imageView public class SelectPhotoFromAlbum extends AppCompatActivity { private Button mBtnTakePhoto; private ImageView mIvPicture; private static final int CHOOSE_PHOTO = 16; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_photo_from_album); //找到控件 mBtnTakePhoto = (Button) findViewById(R.id.btn_choose_from_album); mIvPicture = (ImageView) findViewById(R.id.iv_picture); //点击事件 mBtnTakePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //申请权限 //运行时权限 if (ContextCompat.checkSelfPermission(SelectPhotoFromAlbum.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(SelectPhotoFromAlbum.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); } //运行时权限回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //如果用户允许请求进行的操作 openAlbum(); } else { //如果用户拒绝请求进行的操作 Toast.makeText(this, "You denid the permission", Toast.LENGTH_SHORT).show(); } break; default: break; } } //意图的回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { //判断手机系统版本号,因为4.4版本开始,选取相册图片不再返回图片真实Uri,而是一个封装过的Uri,要进行解析 if (Build.VERSION.SDK_INT >= 19) { //4.4及以上版本 handleImageOnKitKat(data); } else { //4.4以下版本 handleImageBeforeKitKat(data); } } break; default: break; } } //4.4及以上版本 @TargetApi(19) private void handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); //如果document类型的Uri,则通过document id 处理 if (DocumentsContract.isDocumentUri(this, uri)) { String docId = DocumentsContract.getDocumentId(uri); if ("com.android.providers.media.documents".equals(uri.getAuthority())) { String id = docId.split(":")[1];//解析出数字格式的id String selection = MediaStore.Images.Media._ID + "=" + id; //根据Uri和selection来获取真实的图片路径 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); } //如果是content类型的Uri,则通过普通方式处理 } else if ("content".equalsIgnoreCase(uri.getScheme())) { imagePath = getImagePath(uri, null); //如果是file类型的Uri,直接获取图片路径即可 } else if ("file".equalsIgnoreCase(uri.getScheme())) { imagePath = uri.getPath(); } //根据图片路径显示图片 displayImage(imagePath); } //4.4以下版本 private void handleImageBeforeKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri, null); displayImage(imagePath); } //根据Uri和selection来获取真实的图片路径 private String getImagePath(Uri externalContentUri, String selection) { String path = null; Cursor cursor = getContentResolver().query(externalContentUri, null, selection, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); } return path; } //根据图片路径显示图片 private void displayImage(String imagePath) { if(imagePath!=null){ Bitmap bitmap= BitmapFactory.decodeFile(imagePath); mIvPicture.setImageBitmap(bitmap); }else{ Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show(); } } }
转载于:https://my.oschina.net/u/3620480/blog/1483834