Android IllegalArgumentException:错误流类型21

Android IllegalArgumentException:错误流类型21,android,android-audiomanager,Android,Android Audiomanager,我有时会在playStore上遇到以下异常情况。它发生在不同的设备上,也发生在不同的Android版本上。我在测试过程中从来没有出现过这样的错误,我不能产生这样的错误。getStreamVolume可能有什么问题 java.lang.IllegalArgumentException: Bad stream type 21 at android.os.Parcel.readException(Parcel.java:1326) at android.os.Parcel.readException(

我有时会在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));    
    }
}
onCreate上的AudioManager:

//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){}
检查

AFAIK-为了防止您这边的崩溃,对于不是您这边的设备重启,所以我很抱歉您不能处理这个问题,错误被转移到三星和lG-(制造商)身上。因此,是的,设备可能会在应该的时候重新启动,至少你会通过设置try/catch块让用户相信这不是你的错,但如果不是,用户会把责任推到你身上,因为所有这些都是在你的应用程序崩溃时启动的。如果你真的读了这篇文章,那么解决方法就是放置一个try/catch块或返回0或其他任何东西,所以我认为这是你最好的选择


希望有帮助。

哪些设备受此影响?你能说出一两个吗?他们都来自同一家供应商吗?目前我只是三星,我发现了以下问题:我可以通过在amanager.getStreamVolume(AudioManager.STREAM_RING)和amanager.getStreamVolume(AudioManager.STREAM_ALARM)周围加入一个try-catch来解决这个问题吗?对于这些,我可以使用默认参数吗?或者仅仅通过访问它就发生了?用户的最后一条消息是应用程序崩溃,他必须重新启动手机。他将三星S6 edge与安卓5.0.2配合使用,我认为这也是一个硬件问题。但是getStreamVolume是个问题。如果我用try/catch环绕getStreamVolume,我想我的应用程序中不会再出现错误,但手机是否需要重新启动?如果只是访问它是一个问题,我不允许访问getStreamVolume。用try/catch解决了吗?我会在每个getStreamVolume上安装一个try/catch,希望一切都正常。