1.动态获取读写权限
private static String[] PERMISSIONS_STORAGE = new String[]{ "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.read_EXTERNAL_STORAGE"};// 读取权限 private static final int PHOTO_REQUEST_GALLERY = 1;// 从相册中选择
检查权限
private void checkPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } else { pickPicture(); } } else { pickPicture(); }
请求权限结果
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_EXTERNAL_STORAGE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { pickPicture(); } else { Log.e(TAG, "---没有读写权限"); } } }
打开相册
private void pickPicture() { //从图库选择图片 // Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // intent.setType("image/*"); Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PHOTO_REQUEST_GALLERY); }
打开相册选择图片后返回
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { Log.e(TAG, "---onActivityResult resultCode:error"); return; } //外界的程序访问ContentProvider所提供数据 通过ContentResolver接口 ContentResolver resolver = getContentResolver(); Bitmap bm = null; if (requestCode == PHOTO_REQUEST_GALLERY) { if (data != null) { try { Uri uri = data.getData();//图片uri bm = MediaStore.Images.Media.getBitmap(resolver, uri); File file = FileUtil.getFileByUri(this, uri); } catch (Exception e) { e.printStackTrace(); } } } }
-------
根据Uri返回文件的工具类
public class FileUtil { private static final String TAG= "FileUtil"; /** * 根据图片的Uri获取图片的绝对路径(已经适配多种API) * @return 如果Uri对应的图片存在,那么返回该图片的绝对路径,否则返回null */ public static String getRealPathFromUri(Context context, Uri uri) { int sdkVersion = Build.VERSION.SDK_INT; if (sdkVersion < 11) { // SDK < Api11 return getRealPathFromUri_BelowApi11(context, uri); } if (sdkVersion < 19) { // SDK > 11 && SDK < 19 return getRealPathFromUri_Api11To18(context, uri); } // SDK > 19 return getRealPathFromUri_AboveApi19(context, uri); } /** * 适配api19以上,根据uri获取图片的绝对路径 */ public static String getRealPathFromUri_AboveApi19(Context context, Uri uri) { String filePath = null; String wholeID = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { wholeID = DocumentsContract.getDocumentId(uri); } // 使用':'分割 String id = wholeID.split(":")[1]; String[] projection = { MediaStore.Images.Media.DATA }; String selection = MediaStore.Images.Media._ID + "=?"; String[] selectionArgs = { id }; Cursor cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null); int columnIndex = cursor.getColumnIndex(projection[0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); return filePath; } /** * 适配api11-api18,根据uri获取图片的绝对路径 */ public static String getRealPathFromUri_Api11To18(Context context, Uri uri) { String filePath = null; String[] projection = { MediaStore.Images.Media.DATA }; CursorLoader loader = new CursorLoader(context, uri, projection, null, null, null); Cursor cursor = loader.loadInBackground(); if (cursor != null) { cursor.moveToFirst(); filePath = cursor.getString(cursor.getColumnIndex(projection[0])); cursor.close(); } return filePath; } /** * 适配api11以下(不包括api11),根据uri获取图片的绝对路径 */ public static String getRealPathFromUri_BelowApi11(Context context, Uri uri) { String filePath = null; String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { cursor.moveToFirst(); filePath = cursor.getString(cursor.getColumnIndex(projection[0])); cursor.close(); } return filePath; } /** * 通过Uri返回File文件 * 注意:通过相机的是类似content://media/external/images/media/97596 * 通过相册选择的:file:///storage/sdcard0/DCIM/Camera/IMG_20150423_161955.jpg * 通过查询获取实际的地址 * @param uri * @return */ public static File getFileByUri(Context context,Uri uri) { String path = null; if ("file".equals(uri.getScheme())) { path = uri.getEncodedPath(); if (path != null) { path = Uri.decode(path); ContentResolver cr = context.getContentResolver(); StringBuffer buff = new StringBuffer(); buff.append("(").append(MediaStore.Images.ImageColumns.DATA).append("=").append("'" + path + "'").append(")"); Cursor cur = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA }, buff.toString(), null, null); int index = 0; int dataIdx = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID); index = cur.getInt(index); dataIdx = cur.getColumnIndex(MediaStore.Images.ImageColumns.DATA); path = cur.getString(dataIdx); } cur.close(); if (index == 0) { } else { Uri u = Uri.parse("content://media/external/images/media/" + index); System.out.println("temp uri is :" + u); } } if (path != null) { return new File(path); } } else if ("content".equals(uri.getScheme())) { // 4.2.2以后 String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); Log.e(TAG,"--picturePath:"+path); return new File(path); } else { Log.e(TAG, "Uri Scheme:" + uri.getScheme()); } return null; } }