如何将MediaPlayer对象从服务发送到片段?

时间:2015-05-01 04:51:08

标签: android android-fragments android-mediaplayer

我构建了一个Radio Streaming应用程序,我很难将我的MediaPlayer对象从我的服务发送到片段。下面是我的服务和我的片段代码。当我尝试运行代码时,它总是崩溃

public class StreamService extends Service implements
  MediaPlayer.OnCompletionListener,
  MediaPlayer.OnPreparedListener,
  MediaPlayer.OnErrorListener,
  MediaPlayer.OnBufferingUpdateListener {

private static final int NOTIFICATION_ID = 1;
private PhoneStateListener phoneStateListener;
private TelephonyManager telephonyManager;
private boolean isPausedInCall = false;
private NotificationCompat.Builder builder;

//intent
private Intent bufferIntent;

public static final MediaPlayer mediaPlayer = new MediaPlayer();

ScheduledExecutorService scheduleTaskExecutor, reminderTaskExecutor;

private ScheduleModel scheduleModel;

private int currentHour;
private String currentDay, notificationTitle;

private final IBinder mBinder = new LocalBinder();

@Override
public void onCreate() {
    super.onCreate();

    bufferIntent = new Intent(BROADCAST_BUFFER);

    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnErrorListener(this);
    mediaPlayer.setOnBufferingUpdateListener(this);

    mediaPlayer.reset();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    reminderTaskExecutor = Executors.newScheduledThreadPool(5);
    reminderTaskExecutor.scheduleAtFixedRate(new Runnable() {
        public void run() {
            //initNotification();
        }
    }, 0, 1, TimeUnit.MINUTES);

    telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    phoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_OFFHOOK:
                case TelephonyManager.CALL_STATE_RINGING:
                    if (mediaPlayer != null) {
                        pauseMedia();
                        isPausedInCall = true;
                    }
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    if (mediaPlayer != null) {
                        if (isPausedInCall) {
                            isPausedInCall = false;
                            playMedia();
                        }
                    }
                    break;
            }
        }
    };

    telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

    initNotification();

    mediaPlayer.reset();

    /**
     * play media
     */
    if (!mediaPlayer.isPlaying()) {
        try {
            mediaPlayer.setDataSource(URL_STREAM);

            // sent to UI radio is buffer
            sendBufferingBroadcast();

            mediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            Log.d("error", e.getMessage());
        } catch (IllegalStateException e) {
            Log.d("error", e.getMessage());
        } catch (IOException e) {
            Log.d("error", e.getMessage());
        }
    }

    return START_STICKY;
}

public class LocalBinder extends Binder {
    public StreamService getService() {
        // Return this instance of LocalService so clients can call public methods
        return StreamService.this;
    }
}


@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
}


@Override
public void onCompletion(MediaPlayer mediaPlayer) {
    stopMedia();
    stopSelf();
}


@Override
public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
    switch (what) {
        case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            Toast.makeText(this, "Error not valid playback", Toast.LENGTH_SHORT).show();
            break;
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            Toast.makeText(this, "Error server died", Toast.LENGTH_SHORT).show();
            break;
        case MediaPlayer.MEDIA_ERROR_UNKNOWN:
            Toast.makeText(this, "Error occurred, please try again", Toast.LENGTH_SHORT).show();
            break;
    }
    return false;
}


@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    // sent to UI, audio has buffered
    sendBufferCompleteBroadcast();

    playMedia();
}


private void pauseMedia() {
    if (mediaPlayer.isPlaying())
        mediaPlayer.pause();
}

private void playMedia() {
    if (!mediaPlayer.isPlaying()) {
        mediaPlayer.start();
    }
}

private void stopMedia() {
    if (mediaPlayer.isPlaying())
        mediaPlayer.stop();
}

/**
 * sent buffering
 */
private void sendBufferingBroadcast() {
    bufferIntent.putExtra("buffering", "1");
    sendBroadcast(bufferIntent);
}

/**
 * sent buffering complete
 */
private void sendBufferCompleteBroadcast() {
    bufferIntent.putExtra("buffering", "0");
    sendBroadcast(bufferIntent);
}


@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("tag", "remove notification");
    if (mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
    }

    if (phoneStateListener != null) {
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
    }

    cancelNotification();
}

}

My Fragment,代码崩溃在线mVisualizerView.link(StreamService.mediaPlayer);

private void startVisualizerView(){

mVisualizerView = (VisualizerView) getView().findViewById(R.id.visualizerView);
mVisualizerView.link(StreamService.mediaPlayer);

// Start with just line renderer
addLineRenderer();
}

private void startVisualizerView(){

    mVisualizerView = (VisualizerView) getView().findViewById(R.id.visualizerView);
    mVisualizerView.link(StreamService.mediaPlayer);

    // Start with just line renderer
    addLineRenderer();
}

private void startStreaming(Context context) {

    stopStreaming();
    try {
        getActivity().startService(serviceIntent);

        Toast.makeText(context, "Enjoy #Hashtag Radio...", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
    }

}

private void stopStreaming() {
    try {
        getActivity().stopService(serviceIntent);
        // reset streaming tag
        isStreaming = false;
        Utils.setDataBooleanToSP(getActivity(), Utils.IS_STREAM, false);
    } catch (Exception e) {

    }
}

private void startStreaming(Context context) {

stopStreaming();
try {
    getActivity().startService(serviceIntent);
    startVisualizerView();
    Toast.makeText(context, "Enjoy #Hashtag Radio...", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
}

}

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName className,
                               IBinder service) {
    // We've bound to LocalService, cast the IBinder and get LocalService instance
    StreamService.LocalBinder binder = (StreamService.LocalBinder) service;
    mService = binder.getService();
    mBound = true;
}

@Override
public void onServiceDisconnected(ComponentName arg0) {
    mBound = false;
}
};

0 个答案:

没有答案