IllegalArgumentException:错误的流类型 21

IllegalArgumentException: Bad stream type 21

我有时会在 playStore 上遇到以下异常。它出现在不同的设备上,也出现在不同的 Android 版本上。我在测试期间从未遇到过这样的错误,我不能产生那个错误。 getStreamVolume 可能有什么问题?

java.lang.IllegalArgumentException: Bad stream type 21
at android.os.Parcel.readException(Parcel.java:1326)
at android.os.Parcel.readException(Parcel.java:1276)
at android.media.IAudioService$Stub$Proxy.getStreamVolume(IAudioService.java:508)
at android.media.AudioManager.getStreamVolume(AudioManager.java:487)
at de.free.Activity.startStopService(Activity.java:452)
at de.free.Activity.onClick(Activity.java:409)
at android.view.View.performClick(View.java:2506)
at android.widget.CompoundButton.performClick(CompoundButton.java:99)
at android.view.View$PerformClick.run(View.java:9112)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
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:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)

这就是方法 startStopService 中的代码:

private void startStopService() {
    long now = new Date().getTime();

    Intent i = new Intent(this, AppService.class);

    i.putExtra(AppService.VOLUME, volumeBar.getProgress());
    i.putExtra(AppService.RINGER, amanager.getRingerMode());
    i.putExtra(AppService.ACT_VOL, amanager.getStreamVolume(amanager.getStreamVolume(AudioManager.STREAM_RING)));
    i.putExtra(AppService.VOL_ALM, amanager.getStreamVolume(amanager.getStreamVolume(AudioManager.STREAM_ALARM)));
    i.putExtra(AppService.TIME_NOW, now);

    PendingIntent pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);   

    if((tb_runBG.isChecked())) {        
        alarmManager.cancel(pi);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 *update_time, pi);    
    } else {
        alarmManager.cancel(pi);
        stopService(new Intent(this, AppService.class));    
    }
}

创建时的音频管理器:

//sets the range between 0 and the max volume
volumeBar.setMax(amanager.getStreamMaxVolume(AudioManager.STREAM_RING));

我认为这是一个硬件问题,请将您的代码放入 try/catch 代码

try{
    //sets the range between 0 and the max volume
    volumeBar.setMax(amanager.getStreamMaxVolume(AudioManager.STREAM_RING));
 }catch(IllegalArgumentException e){}

检查this

A​​FAIK - 为了防止您这边的崩溃,至于设备重启不是您这边的,所以很抱歉您无法解决这个问题,错误正在转移到三星和 LG-(制造商)。所以是的,设备可能会在它应该重启的时候重启,至少你会通过放置 try/catch 块让用户相信这不是你的错,但如果不是,用户会把责任推给你,因为一切都是在你的应用程序崩溃时开始的.如果你阅读 post 实际上解决方案是放置一个 try/catch 块或 return 0 或任何东西,所以我认为这是你最好的选择。

希望对您有所帮助。