1

我正在尝试播放用户选择的铃声。

当我使用此代码时:

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 is 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 不为空,铃声播放...

谁能解释这里发生了什么,以及我应该做些什么来避免这种黑客攻击?

谢谢

4

1 回答 1

4

RingtoneManager 有两个构造函数。其中一个接受一个上下文,另一个接受一个活动。根据文档,接受 Activity 的那个将为您管理光标。接受 Context 的人不会。

如果要相信文档,听起来您this不是 Activity,因此,RingtoneManager您获得的实例不是管理光标,而是希望您调用getCursor().

于 2013-02-10T23:16:07.450 回答