我已经实现了一个媒体播放器和媒体控制器,用于流式传输MP3 URL。但是,我的设备在T-Mobile网络上并没有很好的3G信号,所以它使用EDGE运行。我假设媒体播放器崩溃是因为流速太慢或不完整,是否可以设置超时时间?
我已经实现了一个媒体播放器和媒体控制器,用于流式传输MP3 URL。但是,我的设备在T-Mobile网络上并没有很好的3G信号,所以它使用EDGE运行。我假设媒体播放器崩溃是因为流速太慢或不完整,是否可以设置超时时间?
MediaPlayer中没有timeout方法,但是您可以自己实现 - 有多种方法可以做到这一点。 我建议其中之一,我自己使用过并且有效 - BroadcastReceiver 代码如下:
public class ConnectivityCheckingReceiver extends WakefulBroadcastReceiver
{
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
@Override
public void onReceive(Context context, Intent intent)
{
if (MusicService.mediaPlayer != null)
{
if (!MusicService.mediaPlayer.isPlaying())
Log.v("Music", "Music is NOT playing");
//stop service and notify user
else
Log.v("Music", "Music is playing");
}
else
{
Log.v("Music", "User stopped player");
}
}
public void setAlarm (Context context, int hour, int minute, int second)
{
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, ConnectivityCheckingReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
}
ConnectivityCheckingReceiver conCheck = new ConnectivityCheckingReceiver();
conCheck.setAlarm(context, hour, min, second);
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name=".receivers.ConnectivityCheckingReceiver" />
PS,我的解决方案并不完美,但我还没有看到任何好的答案来回答这个问题,如果你找到了,请分享。
实际上,Mediaplayer需要一些时间来缓冲,在网络较慢的情况下可能会导致问题。
您无法控制此过程,也没有用户设置超时,但您可以通过捕获setDataSource()、prepare()、prepareAsync()和start()等方法可能抛出的所有异常来确保它不会使您的应用程序崩溃。