How to get the Uri from MediaStore via file path?

后端 未结 4 974
别那么骄傲
别那么骄傲 2020-12-15 12:53

In my program, I want to save a selected ringtone by it\'s file path, and then set it as the current ringtone later.

I have got the ringtone uri from RingtonePrefere

4条回答
  •  鱼传尺愫
    2020-12-15 13:27

    You can also do this in a more generic manner for any content in the MediaStore. I have to get the path from URIs and get the URI from paths. The former:

    /**
     * Gets the corresponding path to a file from the given content:// URI
     * @param selectedVideoUri The content:// URI to find the file path from
     * @param contentResolver The content resolver to use to perform the query.
     * @return the file path as a string
     */
    private String getFilePathFromContentUri(Uri selectedVideoUri,
            ContentResolver contentResolver) {
        String filePath;
        String[] filePathColumn = {MediaColumns.DATA};
    
        Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
        cursor.moveToFirst();
    
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        filePath = cursor.getString(columnIndex);
        cursor.close();
        return filePath;
    }
    

    The latter (which I do for videos, but can also be used for Audio or Files or other types of stored content by substituting MediaStore.Audio (etc) for MediaStore.Video:

    /**
     * Gets the MediaStore video ID of a given file on external storage
     * @param filePath The path (on external storage) of the file to resolve the ID of
     * @param contentResolver The content resolver to use to perform the query.
     * @return the video ID as a long
     */
    private long getVideoIdFromFilePath(String filePath,
            ContentResolver contentResolver) {
    
    
        long videoId;
        Log.d(TAG,"Loading file " + filePath);
    
                // This returns us content://media/external/videos/media (or something like that)
                // I pass in "external" because that's the MediaStore's name for the external
                // storage on my device (the other possibility is "internal")
        Uri videosUri = MediaStore.Video.Media.getContentUri("external");
    
        Log.d(TAG,"videosUri = " + videosUri.toString());
    
        String[] projection = {MediaStore.Video.VideoColumns._ID};
    
        // TODO This will break if we have no matching item in the MediaStore.
        Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
        cursor.moveToFirst();
    
        int columnIndex = cursor.getColumnIndex(projection[0]);
        videoId = cursor.getLong(columnIndex);
    
        Log.d(TAG,"Video ID is " + videoId);
        cursor.close();
        return videoId;
    }
    

    Basically, the DATA column of MediaStore (or whichever sub-section of it you're querying) stores the file path, so you use that info to look it up.

提交回复
热议问题