Android: Mediaplayer запускается как ракета, ушел - PullRequest
2 голосов
/ 03 апреля 2011

Я пытаюсь создать виджет проигрывателя потокового мультимедиа.Я могу заставить его играть, но нажатие кнопки stop дает (или дает) исключение NullpointerException (но PAUSE и STOP действительно хорошо отображаются в Logcat).Итак, медиаплеер запускается, и его уже нет, и я не могу его вернуть.Это должно быть что-то маленькое, что я делаю не так, но я просто не могу понять, что за этим стоит.Есть идеи?


public class MyWidget extends AppWidgetProvider implements
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {

    public static String PLAY = "Play";
    public static String STOP = "Stop";
    public static String PAUSE = "Pause";

     private String TAG = getClass().getSimpleName();
     private MediaPlayer mp;

     @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

        Intent play = new Intent(context, MyWidget.class);
        play.setAction(PLAY);
        PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, play, 0);
        remoteViews.setOnClickPendingIntent(R.id.play, actionPendingIntent);

        play = new Intent(context, MyWidget.class);
        play.setAction(PAUSE);
        actionPendingIntent = PendingIntent.getBroadcast(context, 0, play, 0);
        remoteViews.setOnClickPendingIntent(R.id.pause, actionPendingIntent);

        play = new Intent(context, MyWidget.class);
        play.setAction(STOP);
        actionPendingIntent = PendingIntent.getBroadcast(context, 0, play, 0);
        remoteViews.setOnClickPendingIntent(R.id.stop, actionPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(PLAY)) {
            Log.i("onReceive", PLAY);
            play();

        } else if (intent.getAction().equals(PAUSE)) {
            Log.i("onReceive", PAUSE);
            pause();

        } else if (intent.getAction().equals(STOP)) {
            Log.i("onReceive", STOP);
            stop();

        } else {
            super.onReceive(context, intent);
        }


    }

    private void play() {

             try {
           if (mp == null) {
            this.mp = new MediaPlayer();
           } else {
            mp.stop();
            mp.reset();
           }
           mp.setDataSource("MyURL"); // Go to Initialized state
           mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
           mp.setOnPreparedListener(this);
           mp.setOnBufferingUpdateListener(this);

           mp.setOnErrorListener(this);
           mp.prepareAsync();

           Log.d(TAG, "LoadClip Done");
          } catch (Throwable t) {
           Log.d(TAG, t.toString());
          }
         }

         public void onPrepared(MediaPlayer mp) {
          Log.d(TAG, "Stream is prepared");
          try {
          mp.start();
          } catch (Exception e) {
          // 
          }
         }

         private void pause() {
          try {
             mp.pause();
         } catch (Exception e) {
              //
              }
         }

         private void stop() {

             try {
             mp.stop();
             mp.reset();
         } catch (Exception e) {
              // 
              }

         }

         public void onCompletion(MediaPlayer mp) {
          stop();
         }

         public boolean onError(MediaPlayer mp, int what, int extra) {
          StringBuilder sb = new StringBuilder();
          sb.append("Media Player Error: ");
          switch (what) {
          case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
           sb.append("Not Valid for Progressive Playback");
           break;
          case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
           sb.append("Server Died");
           break;
          case MediaPlayer.MEDIA_ERROR_UNKNOWN:
           sb.append("Unknown");
           break;
          default:
           sb.append(" Non standard (");
           sb.append(what);
           sb.append(")");
          }
          sb.append(" (" + what + ") ");
          sb.append(extra);
          Log.e(TAG, sb.toString());
          return true;
         }

         public void onBufferingUpdate(MediaPlayer mp, int percent) {
          Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
         }

            }

РЕДАКТИРОВАТЬ: (редактировать отменено)

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Хорошо, я нашел ответ сам: невозможно создать медиаплеер, как я хотел, с кодом выше. Я решил добавить функциональность плеера в сервис, и теперь он работает как шарм. Дело закрыто!

0 голосов
/ 03 апреля 2011

Просто предложение, основанное на успехе в моем собственном приложении, попробуйте добавить appWidgetId и PendingIntent.FLAG_CANCEL_CURRENT в качестве параметров getBroadcast:

PendingIntent.getBroadcast(context, appWidgetId, play, PendingIntent.FLAG_CANCEL_CURRENT);

Вам, конечно, нужно будет перебрать массив appWidgetIds.

...