当前位置: 首页 > 知识库问答 >
问题:

不同android api中获取路径的URI无效

傅越
2023-03-14

错误:

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES + "/Prokaton/Big");
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);

    if (Build.VERSION.SDK_INT < 11)
        mCurrentPhotoPath = RealPathUtil.getRealPathFromURI_BelowAPI11(this, Uri.fromFile(image));

        // SDK >= 11 && SDK < 19
    else if (Build.VERSION.SDK_INT < 19)
        mCurrentPhotoPath = RealPathUtil.getRealPathFromURI_API11to18(this, Uri.fromFile(image));

        // SDK > 19 (Android 4.4)
    else
        mCurrentPhotoPath = RealPathUtil.getRealPathFromURI_API19(this, Uri.fromFile(image));
    ...
}
@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri){
    String filePath = "";
    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 = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            column, sel, new String[]{ id }, null);

    int columnIndex = cursor.getColumnIndex(column[0]);

    if (cursor.moveToFirst()) {
        filePath = cursor.getString(columnIndex);
    }
    cursor.close();
    return filePath;
}


@SuppressLint("NewApi")
public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    String result = null;

    CursorLoader cursorLoader = new CursorLoader(
            context,
            contentUri, proj, null, null, null);
    Cursor cursor = cursorLoader.loadInBackground();

    if(cursor != null){
        int column_index =
                cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        result = cursor.getString(column_index);
    }
    return result;
}

public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
    int column_index
            = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    // 2. pick image only
    intent.setType("image/*");
    // 3. start activity
    startActivityForResult(intent, 0);

共有1个答案

卢子民
2023-03-14

尝试在方法中使用此代码(对所有API版本使用相同的代码)

希望它能帮到你

    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(uri, proj, null, null, null);
        if (cursor == null) { 
            result = uri.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return result;
 类似资料:
  • 因此,我使用Reformation将图像上传到我们的服务器,并使用gallery chooser选择图像。我试图获取图像的路径,因为uri。getPath()返回未找到的文件作为异常。我几乎看过关于这个主题的每一篇stackoverflow文章,但仍然没有答案。下面的代码与我在网上看到的所有代码都类似,它总是返回null,我不知道为什么。请帮忙

  • 问题内容: 我输入的是一个字符串。如何获得最后的路径段(在我的情况下是id)? 这是我的输入URL: 我必须获得我尝试过的ID: 但这是行不通的,并且肯定有更好的方法可以做到这一点。 问题答案: 是您要寻找的: 或者

  • 我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?

  • 我想从图库中选择一个图像,然后使用它将图像加载到ImageView项中。 但是图像没有以正确的方式旋转,所以我应该使用ExifInterface类,并且exif构造函数希望文件的路径是字符串,而不是URI。 为了将URI转换为字符串,我编写了以下方法: 问题从这里开始... 结果变量总是返回null。我尝试了stackoverflow中的许多解决方案,如下所示: 我试图用null值查询投影。仍然返

  • 问题内容: 在我的应用程序中,我想使用文件夹中存在的资源 为了获得该路径,我使用了位于以下位置的这段代码: 显示的错误是: 如果我更改该代码: 变量absolutePath采用以下值: 为什么它指向目标路径?我该如何更改? 问题答案: 我的猜测是,绝对路径问题是由于maven POM目标中的outputDirectory引起的。在我的项目中,outputDirectory war / WEB-IN

  • 问题内容: 方法request.getRequestURI()返回带有上下文路径的URI。 例如,如果一个应用程序的基本网址(即上下文路径是 MYAPP ),和我打电话了,它将返回。 有什么办法可以让我们只获得这部分,即没有上下文路径的URI? 问题答案: 如果您位于映射在前缀模式上的前contoller servlet内,则可以使用。 假设您的示例中的servlet映射到,则将返回该值,这将是典