Converting file:// scheme to content:// scheme

后端 未结 3 900
孤独总比滥情好
孤独总比滥情好 2021-01-03 00:07

I am running to the problem with using Droid X\'s Files app and Astro file manager to select an image file. This two apps return the selected image with the scheme \"file://

相关标签:
3条回答
  • 2021-01-03 00:44

    You probably want to convert content:// to file://

    For gallery images, try something like this:

    Uri myFileUri;
    Cursor cursor = context.getContentResolver().query(uri,new String[]{android.provider.MediaStore.Images.ImageColumns.DATA}, null, null, null);
    if(cursor.moveToFirst())
    {
        myFileUri = Uri.parse(cursor.getString(0)).getPath();
    }
    cursor.close
    
    0 讨论(0)
  • 2021-01-03 00:45

    Here, the problem is that, for all files we can't have a content Uri (content://). Because content uri is for those files which are part of MediaStore. Eg: images, audio & video.

    However, for supported files, we can find its absolute path. Like for images as follows-

    File myimageFile = new File(path);
    Uri content_uri=getImageContentUri(this,myimageFile);
    

    The generic method is as follows.

    public static Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Images.Media._ID },
            MediaStore.Images.Media.DATA + "=? ",
            new String[] { filePath }, null);
    
    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor
                .getColumnIndex(MediaStore.MediaColumns._ID));
        Uri baseUri = Uri.parse("content://media/external/images/media");
        return Uri.withAppendedPath(baseUri, "" + id);
    } else {
        if (imageFile.exists()) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, filePath);
            return context.getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }}
    
    0 讨论(0)
  • 2021-01-03 01:02

    Use ContentResolver.openInputStream() or related methods to access the byte stream. You shouldn't generally be worrying about whether it is a file: or content: URI.

    http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)

    0 讨论(0)
提交回复
热议问题