我正在使用媒体播放器服务从网址流式传输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" />
答案 0 :(得分:2)
@Override
方法没有onPrepared()
注释。通常它不应该是一个问题,但谁知道。
答案 1 :(得分:1)
如果您要使用d c b a
来传输文件,我建议您使用EXOPlayer Library。页面上也有一个样本。