繁体   English   中英

Android-从URI获取文件路径

[英]Android - Getting file path from URI

我有一个图像处理应用程序。 在我的代码中,我将服务传递给ArrayList,其余的由服务完成。 现在,我想扩展我的应用程序的功能,并让用户能够进入图库,选择一张图片,然后使用“共享”按钮将其发送到我的应用程序进行处理。 我想尽可能多地重用代码,所以我决定一种不错的方法是将send操作返回的URI转换为实际文件路径。 我的解决方案可以与QuickPic一起使用,但不能与Google相册一起使用。 我的代码如下:

//MainFragment.onCreateView()
Intent intent = getActivity().getIntent();
if(Intent.ACTION_SEND.equals(intent.getAction()) {
    handleSingleImage(intent);
}

private void handleSingleImage(Intent intent) {
    Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);

    Log.d("MYURISTRING", uri.toString());
    ArrayList<String> selectedPaths = new ArrayList<String>();

    String path = Utils.getRealPathFromURI(getActivity(), uri);

    selectedPaths.add(path);

    Utils.startProcessPhotosService(getActivity(), MainFragment.this, selectedPaths);
}

//Utils
public static String getRealPathFromURI(Context context, Uri contentUri) {
    /*String[] proj = {MediaStore.Images.Media.DATA};

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

    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();

    return cursor.getString(columnIndex);*/

    ContentResolver contentResolver = context.getContentResolver();
    Cursor cursor = contentResolver.query(contentUri, null, null, null, null);
    cursor.moveToFirst();

    String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));

    cursor.close();

    return path;
}

如果我使用来自QuickPic应用程序的照片进行测试,那么一切都会按预期进行,并且日志中的URI如下:

content://media/external/images/media/135695

但是,如果我使用Google相册进行测试,则我的应用会崩溃,并且URI如下:

content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F135669/ACTUAL

我该如何支持这两种URI样式(并且可能还支持更多样式)? 谢谢

所以我认为一个不错的方法是将send操作返回的URI转换为实际文件路径

之所以如此,是不是一个很好的路要走。

正如我今天已经指出几次,在过去几个月中数十次提到, Uri并不是文件 您不能可靠地获取Uri的本地文件路径。 有可能甚至本地路径,更何况一个可以访问。

如果您希望使用Uri表示的内容,请使用getContentResolver().openInputStream()或依次使用它的东西(例如,用于图像加载的Picasso)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM