例外:设置过滤列应该在查询铃声之前完成.(?)



我试图列出所有Android默认(铃声,闹钟,通知)的声音。但如果我尝试玩其中一个资源,就会得到一个异常。说我应该在查询铃声之前设置类型,但我正在这样做…我不明白。

在我的ArrayList中,我有一些关于为什么会发生这种情况的线索,但是如果有人能帮助我理解为什么会发生这种情况…

列出所有声音

    RingtoneManager ringtoneMgr = new RingtoneManager(this);
    List<Uri> listRingtones = new ArrayList<Uri>();
    int ringTypes[] = {RingtoneManager.TYPE_ALARM,
                       RingtoneManager.TYPE_RINGTONE,
                       RingtoneManager.TYPE_NOTIFICATION};
    for (int ringType : ringTypes) {
        ringtoneMgr.setType(ringType);
        Cursor alarmsCursor = ringtoneMgr.getCursor();
        if (alarmsCursor.getCount() == 0 && !alarmsCursor.moveToFirst()) {
            return null;
        }
        while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
            listRingtones.add(
                       ringtoneMgr.getRingtoneUri(alarmsCursor.getPosition()));
        }
        alarmsCursor.close();
    }

播放列表中的一个声音:

    mMediaPlayer = new MediaPlayer();
    try {
        mMediaPlayer.setDataSource(context, listRingtones.get(selected));
        final AudioManager audioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
            mMediaPlayer.setLooping(true);
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        }
    } catch (IOException e) {
        /*...*/
    }

selected,为列表中所选声音对应的整数值。

列出控制台日志错误:

 FATAL EXCEPTION: main
: java.lang.RuntimeException: Unable to start activity ComponentInfo{AlarmReceiverActivity}: java.lang.IllegalStateException: Setting filter columns should be done before querying for ringtones.
:   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
:   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
:   at android.app.ActivityThread.access$1500(ActivityThread.java:121)
:   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
:   at android.os.Handler.dispatchMessage(Handler.java:99)
:   at android.os.Looper.loop(Looper.java:123)
:   at android.app.ActivityThread.main(ActivityThread.java:3701)
:   at java.lang.reflect.Method.invokeNative(Native Method)
:   at java.lang.reflect.Method.invoke(Method.java:507)
:   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
:   at dalvik.system.NativeStart.main(Native Method)
: Caused by: java.lang.IllegalStateException: Setting filter columns should be done before querying for ringtones.
:   at android.media.RingtoneManager.setType(RingtoneManager.java:268)
:   at AlarmReceiverActivity.getAlarmUri(AlarmReceiverActivity.java:212)
:   at AlarmReceiverActivity.onCreate(AlarmReceiverActivity.java:83)
:   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
:   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
:   ... 11 more

经过一番调查,我弄清楚了为什么在我的代码中抛出这个异常。

问题是因为我查询引起不同类型的声音从RingtoneManager这发生了,因为我使用的一个实例RingtoneManager查询所有类型的声音,所以一旦你查询一种声音你不能查询的其他类型的相同实例RingtoneManager你需要使用一个不同的一个,所以我只是创建一个新的实例RingtoneManager每次查询新的声音。

修改上面的部分代码:

List<Uri> listRingtones = new ArrayList<Uri>();
int ringTypes[] = {RingtoneManager.TYPE_ALARM,
                   RingtoneManager.TYPE_RINGTONE,
                   RingtoneManager.TYPE_NOTIFICATION};
for (int ringType : ringTypes) {
    RingtoneManager ringtoneMgr = new RingtoneManager(this);
    ringtoneMgr.setType(ringType);
    Cursor alarmsCursor = ringtoneMgr.getCursor();
    if (alarmsCursor.getCount() == 0 && !alarmsCursor.moveToFirst()) {
        return null;
    }
    while (!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
        listRingtones.add(
                   ringtoneMgr.getRingtoneUri(alarmsCursor.getPosition()));
    }
    alarmsCursor.close();
}

这就解决了我的问题,希望对你有帮助。

最新更新