android之跳轉相簿選擇圖片/照相
使用環境:
跳轉相簿選擇圖片的時候,對於不同型別的圖片有不同該型別的返回值:
這裡說的就是vivo手機跳轉相簿返回的地址:
1 小米正常返回地址: file:///storage/emulated/0/Tencent/QQ_Images/null2e313c5d73f3b0d5.jpg
2 vivo手機的返回地址: content://media/external/images/media/607657
這時候需要將content開頭的圖片轉換成圖片字尾名為jpg的圖片絕對地址!
(此方法在onActivityForResult中接收到返回圖片地址以後使用)
String u = uri + ""; if ((uri + "").contains("content")) { Log.e(" content轉換之前"+ u); u = ImageUtils.getRealPathFromURI(RecallActivity.this,uri); Log.e(" content轉換之後"+ u); }
處理vivo手機返回地址的問題:
/** * vivo手機的圖片選擇問題 * 返會的是:content://media/external/images/media/607657 * 而正常返: file:///storage/emulated/0/Tencent/QQ_Images/null2e313c5d73f3b0d5.jpg*/ public static String getRealPathFromURI(Context context, Uri contentUri) { //傳入圖片uri地址 String[] proj = { MediaStore.Images.Media.DATA }; CursorLoader loader = new CursorLoader(context, contentUri, proj, null, null, null); Cursor cursor = loader.loadInBackground(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); }
因為本片設計程式碼量比較小,所以沒寫demo ,如果需要直接賦值一下程式碼即可:
前提:
1 判斷是否有照相許可權,讀寫記憶體的許可權,7.0以後對於隱私保護更嚴謹了點。
2 開啟照相功能
private Uri uri; public void toPhoto() { uri = ImageUtils.createImagePathUri(ConfirmWorkActivity.this); RxPermissionsUtils.requestCamera(this, new onRequestPermissionsListener() { @Override public void onRequestBefore() { } @Override public void onRequestLater() {//準確的說也就下面這個跳轉是有用的 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 0); } }); }
預設定Uri的方法:
public static Uri createImagePathUri(final Context context) { final Uri[] imageFilePath = {null}; if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); imageFilePath[0] = Uri.parse(""); } else { String status = Environment.getExternalStorageState(); SimpleDateFormat timeFormatter = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA); long time = System.currentTimeMillis(); String imageName = timeFormatter.format(new Date(time)); ContentValues values = new ContentValues(3); values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName); values.put(MediaStore.Images.Media.DATE_TAKEN, time); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); if (status.equals(Environment.MEDIA_MOUNTED)) { imageFilePath[0] = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { imageFilePath[0] = context.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values); } } return imageFilePath[0]; }至於為什麼,sorry,不知道。
3 重寫onActivityResult接收返回資料,並將返回資料轉化成可以正常使用的圖片地址
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == 0) { capath = uri + ""; if ((capath + "").contains("content")) { capath = ImageUtils.getRealPathFromURI(ConfirmWorkActivity.this, uri); } else if (capath.contains("file:///")) { capath = capath.substring(7, capath.length()); } }}}
4 最後得到的capath 就可以直接顯示。
當然,圖片挺大的需要壓縮,至於如何壓縮目前常用並且最合適的是LuBan壓縮,不懂的可以去百度。
*****跳轉相簿選擇照片*****
1 跳轉圖片選擇介面:
Intent intent = new Intent("android.intent.action.PICK"); intent.setType("image/*"); startActivityForResult(intent, 3);
2 onActivityResult接收返回資料,就不再提示了,如果有任何報錯可參考上面轉換方式。
請原諒寫的這麼碎,因為程式碼是測試很多此得出的結果,所以不停的該改改,當然,有任何疑問均可聯絡小弟:
QQ 532245792
另外寫的怎麼樣,請評論一下,最近感覺狠空寂冷。