我正在尝试播放用户选择的铃声。
当我使用此代码时:
RingtoneManager ringtoneManager = new RingtoneManager(this);
Uri uri = ringtoneManager.getRingtoneUri(position);
if(uri == null) {
Log.d("ALARM", "uri is null");
}
try {
mediaPlayer.setDataSource(getApplicationContext(), uri);
mediaPlayer.prepare();
mediaPlayer.setLooping(true);
mediaPlayer.start();
} catch (Exception e) {
// Handle exception
}
我得到“uri为null”并且没有任何反应,但是如果我像这样预先输入一个空的for循环:
for(int i = 0; i < ringtoneManager.getCursor().getCount(); ++i) {
//WTF
}
RingtoneManager ringtoneManager = new RingtoneManager(this);
Uri uri = ringtoneManager.getRingtoneUri(position);
if(uri == null) {
Log.d("ALARM", "uri is null");
}
try {
mediaPlayer.setDataSource(getApplicationContext(), uri);
mediaPlayer.prepare();
mediaPlayer.setLooping(true);
mediaPlayer.start();
} catch (Exception e) {
// Handle exception
}
uri不为空,铃声播放......
任何人都可以解释这里发生了什么,以及我应该做些什么来避免这种黑客攻击?
由于
答案 0 :(得分:4)
RingtoneManager
has two constructors。其中一个接受Context,另一个接受Activity。根据文档,采用Activity的那个将为你管理光标。采用上下文的那个不会。
如果要相信文档,听起来像this
不是活动,因此,您获得的RingtoneManager
实例不管理游标,并期望您调用{{ 1}}。