为什么添加空for循环修复此代码?

时间:2013-02-10 23:09:48

标签: java android ringtone

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

当我使用此代码时:

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

任何人都可以解释这里发生了什么,以及我应该做些什么来避免这种黑客攻击?

由于

1 个答案:

答案 0 :(得分:4)

RingtoneManager has two constructors。其中一个接受Context,另一个接受Activity。根据文档,采用Activity的那个将为你管理光标。采用上下文的那个不会。

如果要相信文档,听起来像this不是活动,因此,您获得的RingtoneManager实例不管理游标,并期望您调用{{ 1}}。