【问题标题】:android mediaplayer mediacontroller timeoutandroid 媒体播放器媒体控制器超时
【发布时间】:2012-01-22 11:28:24
【问题描述】:

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

【问题讨论】:

    标签: android timeout media-player mediacontroller


    【解决方案1】:

    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,我的解决方案并不完美,但是我没有看到任何关于这个问题的好答案,所以如果找到了,请分享。

    【讨论】:

    • 这个答案很好,但是我正在寻找与媒体播放器 api 本身有关的东西......
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多