1

在我的应用程序中,用户可以使用 RingtonePreference 选择通知。从后者我可以检索所选通知的 Uri,并使用以下代码提取真实文件名:

private String getUriRealPath(Uri contentUri) {
    if (BuildConfig.DEBUG) {
        Log.d(TAG, "Getting real path of uri: " + contentUri.toString());
    }

    String path = null;
    final String[] projection = new String [] { MediaStore.Audio.Media.DATA };
    final Cursor cursor;

    try {
        cursor = mContext.getContentResolver().query(contentUri, projection, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int idx = cursor.getColumnIndex(projection[0]);
             if (idx != -1) {
                 path = cursor.getString(idx);

                 if (BuildConfig.DEBUG) {
                     Log.d(TAG, "Real path is: " + path);
                 }
             }
             else {
                 if (BuildConfig.DEBUG) {
                     Log.d(TAG, "Path can't be resolved.");
                 }
             }
        }
    } catch (Exception e) {
        Log.e(TAG, "getUriRealPath - " + e);
    }

    return path;
}

但是,一旦用户选择了通过第三方下载的通知,上面的代码就找不到真正的路径。提取的原因是我需要在 SoundPool 对象中播放通知的路径。

我可能看多了,但 getContentResolver() 会为我的应用程序返回一个 ContentResolver 实例。我应该使用“全局” ContentResolver 吗?

4

1 回答 1

0

但是,一旦用户选择了通过第三方下载的通知,上面的代码就找不到真正的路径。

无论如何,您可能无权访问实际文件。首先,它可能不作为文件存在,而仅作为流存在。其次,它可能不在您具有读取权限的存储中。您只能通过Uri提供给您的媒体可靠地访问此媒体。

提取的原因是我需要在 SoundPool 对象中播放通知的路径。

然后您将不得不停止使用SoundPool并切换到MediaPlayerAudioTrack或其他内容。

我应该使用“全局” ContentResolver 吗?

没有“全球” ContentResolver

于 2012-11-22T14:11:09.810 回答