项目中有一个功能是更改提醒的声音,这里用到了铃声这方面。本来一直好好的,今天测试提出有个手机在选择系统铃声时出现了崩溃,定位了下发现铃声的文件路径正常拿到了,但是在用cursor查询具体信息时出现了空指针的问题,当时很奇怪路径既然拿到了,为什么数据库查不到啊。直到我把路径打出来才发现问题所在,该路径是file开头的,我们在手机数据库中查询具体信息时,如果不使用content开头的url是不能识别的,正因如此,所以cursor才会为空。知道原因了,修改起来就方便了,既然它需要content的url那么我们就不url转成这样的就行了代码如下
/**
* file开头的uri转换为content开头的uri
*
* @param uri 任意uri
* @return content开头的uri
*/
private Uri file2Content(Uri uri) {
if (uri.getScheme().equals("file")) {
String path = uri.getEncodedPath();
if (path != null) {
path = Uri.decode(path);
ContentResolver cr = this.getContentResolver();
StringBuffer buff = new StringBuffer();
buff.append("(").append(MediaStore.Audio.AudioColumns.DATA).append("=").append("'" + path + "'").append(")");
Cursor cur =
cr.query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.AudioColumns._ID },
buff.toString(), null, null);
int index = 0;
for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) {
index = cur.getColumnIndex(MediaStore.Audio.AudioColumns._ID);
index = cur.getInt(index);
}
if (index == 0) {
//do nothing
} else {
Uri uri_temp = Uri.parse("content://media/internal/audio/media/" + index);
if (uri_temp != null) {
uri = uri_temp;
}
}
}
}
LogUtils.d("uri = " + uri);
return uri;
}
至此问题解决,问题不难,只是发生的较少,所以写篇文章记录下