从Intent.ACTION_GET_CONTENT到文件的URI

lem*_*mon 6 android

  1. 使用Intent.ACTION_GET_CONTENT启动照片选取器
  2. 检索所选项目的URI
  3. 检索URI的PATH,以便我可以将其发布到我的网络服务器

    用于启动浏览的代码

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, BROWSE_IMAGE_REQUEST_CODE);
    
    Run Code Online (Sandbox Code Playgroud)

    用于检索所选图像的代码

    if (RESULT_OK == resultCode &&
                 BROWSE_IMAGE_REQUEST_CODE == requestCode) {
    Uri uri = data.getData();
    
    Run Code Online (Sandbox Code Playgroud)

    要发送到网络服务器的代码

    File file = new File(uri.getPath());
    new FileSystemResourceFile(file);
    
    Run Code Online (Sandbox Code Playgroud)

我目前能够从URI中检索PATH没有概率,/external/images/media/24但由于一些奇怪的原因,文件总是为空,请帮忙吗?

ari*_*ayu 19

我做这个方法来转换UriIntent.ACTION_GET_CONTENT实际路径:

public static String getRealPathFromUri(Activity activity, Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = activity.managedQuery(contentUri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

然后又转换成File:

Uri filePathFromActivity = (Uri) extras.get(Intent.EXTRA_STREAM);
filePathFromActivity = Uri.parse(FileUtil.getRealPathFromUri( (Activity) IntentActivity.this, filePathFromActivity));
File imageFile = new File(filePathFromActivity.getPath());
Run Code Online (Sandbox Code Playgroud)

  • Activity.managedQuery已折旧.使用:CursorLoader loader = new CursorLoader(activity,contentUri,proj,null,null,null); 代替 (2认同)
  • @Patrick对我来说非常不明显你在这种情况下如何使用CursorLoader.或者坦率地说,如何使用它.文档还有很多不足之处.因为我可以在一个线程中运行这个完整的任务,所以我将忽略你的建议并使用已弃用的managedQuery().因为如何使这项工作更加明显,特别是因为我需要同步结果. (2认同)
  • 没有关闭光标 (2认同)