1. 程式人生 > >android之跳轉相簿選擇圖片/照相

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

        另外寫的怎麼樣,請評論一下,最近感覺狠空寂冷。