3

我已经实现了一个媒体播放器和媒体控制器,可以流式传输一个 mp3 url。但是,我在 TMobile 网络上的设备没有获得很好的 3G 信号,因此它在 EDGE 上运行。我假设媒体播放器崩溃是因为流太慢或不完整,我可以设置超时吗?

4

3 回答 3

3

MediaPlayer中没有超时方法,但您可以自己实现它 - 您可以通过多种方式来实现。我建议其中一个,我自己用过,它对我有用 - 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,我的解决方案并不完美,但我没有看到任何好的答案,所以如果找到了,请分享。

于 2015-03-18T20:53:53.483 回答
1

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

于 2012-12-27T12:52:30.643 回答
0

事实上,Mediaplayer 需要一些时间来缓冲,并且在可能导致问题的慢速网络上。

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

于 2012-01-30T11:07:09.463 回答