1

I am trying to play a ringtone selected by the user.

When I use this code:

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
}

I get "uri is null" and nothing happens, however if I put in an empty for loop beforehand like this:

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
}

The uri is not null and the ringtone plays...

Can anyone explain what is going on here, and what I am supposed to do to avoid this hack?

Thanks

4

1 に答える 1

4

RingtoneManager には 2 つのコンストラクターがあります。1 つは Context を受け取り、もう 1 つは Activity を受け取ります。ドキュメントによると、アクティビティを取得するものがカーソルを管理します。Context を取るものはそうしません。

ドキュメントが信じられる場合、あなたthisはアクティビティではないように聞こえるため、RingtoneManager取得しているインスタンスはカーソルを管理しておらず、呼び出しを期待していますgetCursor()

于 2013-02-10T23:16:07.450 に答える