Gallery返回不同Android版本的Intent.ACTION\u GET\u内容的媒体文件的不同URI

Gallery返回不同Android版本的Intent.ACTION\u GET\u内容的媒体文件的不同URI,android,android-intent,Android,Android Intent,下面是一段代码,用于调用intent以打开图像库 public void getImage() { Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); //Intent customChooserIntent = I

下面是一段代码,用于调用intent以打开图像库

public void getImage() {
        Intent i = new Intent();
        i.setType("image/*");
        i.setAction(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        //Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
        startActivityForResult(i, 10);
 }
Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE);
收到对活动结果的响应

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 10) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getRealPathFromURI(selectedImageUri);
              }               
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
            && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bmImage = BitmapFactory.decodeFile(picturePath);

        // setting bitmap to imageview
        // coImage.setImageBitmap(bmImage);

        strEncodeImg = encodeTobase64(bmImage);

        Log.e("Image set successfully...!", "yes......................");
        coImage.setImageBitmap(decodeBase64(strEncodeImg));
    }

}
getRealPathfromURI()的代码


我得到了一个简单的答案,就是在android SDK版本的基础上加密路径

public String getRealPathFromURI(Uri uri) {
    if (Build.VERSION.SDK_INT < 19) {
        String[] projection = {MediaStore.Images.Media.DATA};
        @SuppressWarnings("deprecation")
        Cursor cursor = getActivity().managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } else {
        String selectedImagePath = null;
        String wholeID = DocumentsContract.getDocumentId(uri);
       // Split at colon, use second item in the array
        String id = wholeID.split(":")[1];
        String[] column = {MediaStore.Images.Media.DATA};
        // where id is equal to
        String sel = MediaStore.Images.Media._ID + "=?";
        Cursor cursor = getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null);
        int columnIndex = cursor.getColumnIndex(column[0]);
        if (cursor.moveToFirst()) {
            selectedImagePath = cursor.getString(columnIndex);
        }
        cursor.close();
        return selectedImagePath;
    }
}
公共字符串getRealPathFromURI(Uri){
如果(Build.VERSION.SDK_INT<19){
字符串[]投影={MediaStore.Images.Media.DATA};
@抑制警告(“弃用”)
Cursor Cursor=getActivity().managedQuery(uri、投影、null、null、null);
int column_index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
返回cursor.getString(列索引);
}否则{
字符串selectedImagePath=null;
字符串wholeID=DocumentsContract.getDocumentId(uri);
//在冒号处拆分,使用数组中的第二项
字符串id=wholeID.split(“:”[1];
String[]column={MediaStore.Images.Media.DATA};
//其中id等于
字符串sel=MediaStore.Images.Media._ID+“=?”;
Cursor Cursor=getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,column,sel,新字符串[]{id},null);
int columnIndex=cursor.getColumnIndex(列[0]);
if(cursor.moveToFirst()){
选择edimagepath=cursor.getString(columnIndex);
}
cursor.close();
返回selectedImagePath;
}
}

以下是一段代码,用于调用intent以打开图像库

public void getImage() {
        Intent i = new Intent();
        i.setType("image/*");
        i.setAction(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        //Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
        startActivityForResult(i, 10);
 }
Intent i = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE);
收到对活动结果的响应

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 10) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getRealPathFromURI(selectedImageUri);
              }               
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
            && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bmImage = BitmapFactory.decodeFile(picturePath);

        // setting bitmap to imageview
        // coImage.setImageBitmap(bmImage);

        strEncodeImg = encodeTobase64(bmImage);

        Log.e("Image set successfully...!", "yes......................");
        coImage.setImageBitmap(decodeBase64(strEncodeImg));
    }

}
您可以将此图像以字符串格式保存在数据库中,也可以使用此字符串执行任何操作—无需将图像存储在文件夹中—它只是位图代码。
非常简单。

这是一个非常简单的代码(已测试)

图片:

if (Build.VERSION.SDK_INT <= 19) {
                        Intent i = new Intent();
                        i.setType("image/*");
                        i.setAction(Intent.ACTION_GET_CONTENT);
                        i.addCategory(Intent.CATEGORY_OPENABLE);
                        startActivityForResult(i, 10);
                    } else if (Build.VERSION.SDK_INT > 19) {
                        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(intent, 10);
                    }

尝试删除
getRealPathFromURI()
,因为它无法可靠地工作。它可能不代表您可以在文件系统上访问的任何内容。使用
ContentResolver
上的方法,例如
openInputStream()
,使用
Uri
@Stella看看我的答案,它比这个解决方案简单得多。