Android Media Player服务一旦发布就无法正常工作

时间:2015-08-23 18:39:36

标签: java android

我正在使用媒体播放器服务从网址流式传输mp3。阅读完所有文档和几十篇帖子后,以下是我的最后一段代码。这段代码适用于所有模拟器,但只适用于某些设备,奇怪的行为,其中一些具有相同的操作系统(例如套件kat),适用于某些设备而其他设备不适用...错误已调试,看着logcat,似乎这确实正确地准备了async()但从不抛出onPrepared()。 发布应用程序后,测试在重新打印时运行的设备,也不会流式传输音乐!

public class backgroundAudio extends Service implements MediaPlayer.OnPreparedListener {

    MediaPlayer mediaPlayer;
    WifiLock wifiLock;

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

      @Override
      public void onCreate() {

        mediaPlayer = null;
        String url = "http://www.myserver.com/mystream.mp3"; 
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);

        wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");

        wifiLock.acquire();

        try {
            mediaPlayer.setDataSource(url);
            mediaPlayer.prepareAsync();
            // it takes so long, about a minute...

        } catch (IllegalArgumentException | SecurityException
                | IllegalStateException | IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

      }

      /** Called when MediaPlayer is ready */
        public void onPrepared(MediaPlayer player) {
            mediaPlayer.start();
            radio0.tabBridge.setStopView();
        }

      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
      }

      public void onDestroy() {
            if (mediaPlayer.isPlaying()) {
              mediaPlayer.stop();
              mediaPlayer.release();
            }
            wifiLock.release();
          }

      public void onCompletion(MediaPlayer _mediaPlayer) {
        stopSelf();
      }

相关的清单权限,

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

2 个答案:

答案 0 :(得分:2)

@Override方法没有onPrepared()注释。通常它不应该是一个问题,但谁知道。

答案 1 :(得分:1)

如果您要使用d c b a来传输文件,我建议您使用EXOPlayer Library。页面上也有一个样本。