安卓MediaPlayer媒体控制器超时问题

3

我已经实现了一个媒体播放器和媒体控制器,用于流式传输MP3 URL。但是,我的设备在T-Mobile网络上并没有很好的3G信号,所以它使用EDGE运行。我假设媒体播放器崩溃是因为流速太慢或不完整,是否可以设置超时时间?

3个回答

3

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);

你需要自己实现检查小时/分钟/秒的逻辑,但使用像Joda Time这样的库很容易实现。 不要忘记在清单文件中添加:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name=".receivers.ConnectivityCheckingReceiver" />

PS,我的解决方案并不完美,但我还没有看到任何好的答案来回答这个问题,如果你找到了,请分享。


1
这个回答很好,但是我在寻找与媒体播放器API本身有关的内容... - Divyansh Goenka

1
您也可以在MediaPlayer上使用prepare()而不是prepareAsync(),并将其放置在asyncTask或工作线程中;然后您可以自己实现超时功能。我稍后会添加一个代码示例,但我认为这个想法很清楚。

0

实际上,Mediaplayer需要一些时间来缓冲,在网络较慢的情况下可能会导致问题。

您无法控制此过程,也没有用户设置超时,但您可以通过捕获setDataSource()、prepare()、prepareAsync()和start()等方法可能抛出的所有异常来确保它不会使您的应用程序崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接