【发布时间】:2016-03-03 12:36:11
【问题描述】:
我目前正在为一位客户开发流式广播应用程序, 该应用程序几乎完成并且工作正常。 (假设我测试它时工作正常)。 但问题是它根本无法在我的客户电话上运行。他有一个 Galaxy Note 5,他在美国,(我在斯里兰卡)。我用多部手机测试了这个应用程序,(Galaxy note edge、HTC one M8、Galaxy s5、Galaxy s4、Oneplus one、Galaxy note 3、Huawei Honor 3c、Huawei Ascend)。它在所有这些手机上都能完美运行。但是当他测试它时它不起作用。他说启动paltyer(OMG)花了30多分钟。我通过前台服务调用了媒体播放器,这是我的媒体播放器服务代码。
public class RadioService extends Service implements MediaPlayer.OnBufferingUpdateListener,MediaPlayer.OnErrorListener {
public static final String ACTION_PLAY = "com.example.action.PLAY";
static MediaPlayer mMediaPlayer = null;
public static ChannelDetails channelDetails;
public static int playState =0;
public static boolean isRunning;
public void initMedeaPlayer(){
Log.d("RadioService", "initMediaPlayer");
mMediaPlayer = new MediaPlayer();
mMediaPlayer.reset();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getAction().equals(ACTION_PLAY) && intent.getExtras().getSerializable("channelDetails")!=null) {
Log.d("RadioService", "OnStartCommand");
try{
channelDetails = (ChannelDetails)intent.getExtras().getSerializable("channelDetails");
initMedeaPlayer();
playMusic(null);
foregroundService();
isRunning = true;
}catch(Exception e){
e.printStackTrace();
}
}
return super.onStartCommand(intent, flags, startId);
}
public static void playMusic(ChannelDetails cn) {
try{
if(cn!=null){
channelDetails = cn;
mMediaPlayer.reset();
}else{
}
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(channelDetails.getUrl());
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
playState = 1;
Log.d("RadioService", "OnPrepared");
mp.start();
}
});
}catch(Exception e){
e.printStackTrace();
}
}
public static void pauseMusic() {
try{
mMediaPlayer.pause();
playState=2;
}catch(Exception e){
e.printStackTrace();
}
}
public static void simplePlayMusic() {
try{
mMediaPlayer.start();
playState=1;
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d("RadioService", "OnCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer=null;
isRunning = false;
Log.d("RadioService", "Destroyed");
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void foregroundService(){
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), MainPage.class), PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(getApplicationContext())
.setTicker("Radio.lk")
.setContentTitle(channelDetails.getChannelName())
.setContentText("Online Streaming")
.setSmallIcon(R.mipmap.ic_launcher)
.addAction(R.mipmap.play, "Play", pi)
.addAction(R.mipmap.pause, "Pause", pi)
.addAction(R.mipmap.stop, "Stop", pi)
.setContentIntent(pi).getNotification();
notification.flags |= Notification.FLAG_ONGOING_EVENT;
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
nm.notify(550,notification);
startForeground(550, notification);
}
}
【问题讨论】:
-
媒体播放器是一个非常有问题的类。当它在播放之前缓冲大量数据时会出现问题。 prepareAsync 也不可靠。我的建议是将逻辑转移到单独的线程,以便您可以使用准备而不依赖于 setOnPreparedListener。
-
谢谢大佬,你的意思是除了
mMediaPlayer.prepareAsync();之外我还要自己做缓冲对吧? -
我遇到了同样的问题。如果我想出解决方案,我会告诉你的。只是评论让你知道你并不孤单。
-
可能的解决方案(虽然我有点不满意):stackoverflow.com/questions/32379922/…
-
@AutonomousApps 感谢上帝,我并不孤单,如果有任何解决方案,请告诉我。我也会尝试 ExoPlayer。唯一的一点是我没有 Note 5 设备来自己测试它,这就是为什么它很难解决这个问题。再次感谢。
标签: android android-service android-mediaplayer audio-streaming galaxy