在我的应用中,用户可以使用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;
}
但是,一旦用户选择通过第3方下载的通知,上述代码就无法找到真实路径。 提取的原因是我需要在SoundPool对象中播放通知的路径。
我可能已经看到了这个,但是getContentResolver()为我的应用程序返回了一个ContentResolver实例。我应该使用“全局”ContentResolver吗?
答案 0 :(得分:0)
但是,一旦用户选择通过第3方下载的通知,上述代码就无法找到真实路径。
无论如何,您可能无法访问实际文件。首先,它可能不作为文件存在,而只作为流存在。其次,它可能不在您具有读访问权限的存储中。您只能通过提供给您的Uri
可靠地访问此媒体。
提取的原因是我需要在SoundPool对象中播放通知的路径。
然后,您必须停止使用SoundPool
并切换到MediaPlayer
,AudioTrack
或其他内容。
我应该使用“全局”ContentResolver吗?
没有“全球”ContentResolver
。