在我的应用程序中,用户可以使用 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 吗?