我为多个电台创建了一个在线广播流应用程序。 我是Android新手。我首先在活动中创建了媒体播放器,并且效果很好,但是在后台时我停了下来。所以我决定使用服务重写我的代码。 我在字符串中有三个网址,并且在Listview的itemclicklistener上选择了媒体播放器的数据源。 现在,在使用服务时,如何才能获得所选的数据源,并停止播放中的前一个数据源? 我对此感到非常困惑和浪费。 另一件事是我无法附加需要随媒体播放器状态和服务一起更改的UI操作。也请提供帮助。
这是我的服务班级:
public class MpService extends Service implements MediaPlayer.OnPreparedListener,MediaPlayer.OnErrorListener,
AudioManager.OnAudioFocusChangeListener{
private MediaPlayer mp;
private AudioManager audioManager;
//path to the audio file
private String mediaFile;
private ProgressDialog dialog;
private WifiManager.WifiLock wifiLock;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
try {
//An audio file is passed to the service through putExtra();
mediaFile = intent.getExtras().getString("media");
}
catch (NullPointerException e) {
stopSelf();
}
//Request audio focus
if (requestAudioFocus() == false) {
//Could not gain focus
stopSelf();
}
if (mediaFile != null && mediaFile != "")
initMediaPlayer();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onPrepared(MediaPlayer mp) {
if (dialog!=null){
dialog.dismiss();
}
playMedia();
}
private void playMedia() {
if (!mp.isPlaying()) {
mp.start();
}
}
private void stopMedia() {
if (mp == null) return;
if (mp.isPlaying()) {
mp.stop();
}
}
private void initMediaPlayer() {
// dialog = ProgressDialog.show(this,"","Buffering...",true);
Log.d("abc", "playing and now going to reset : " + mediaFile);
//if (mp.isPlaying()){
//mp.pause();
// mp.stop();
//mp.release();
//mp = new MediaPlayer();
//mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
//try {
// mp.setDataSource(mediaFile);
// mp.prepareAsync();
//} catch (IOException e) {
// Toast.makeText(this, "Radio Offline", Toast.LENGTH_SHORT).show();
//e.printStackTrace();
//}
//mp.setOnPreparedListener(this);
//mp.setOnErrorListener(this);
//}
//else
mp = new MediaPlayer();
mp.reset();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mp.setDataSource(mediaFile);
mp.prepareAsync();
} catch (IOException e) {
Toast.makeText(this, "Radio Offline", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
mp.setOnPreparedListener(this);
mp.setOnErrorListener(this);
getlocks();
}
private void getlocks(){
mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF , "MyWifiLock");
wifiLock.acquire();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
switch (what){
case MEDIA_ERROR_UNKNOWN:
if (dialog!=null) {
dialog.dismiss();
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
}break;
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
Log.d("MediaPlayer Error", "MEDIA ERROR NOT VALID FOR PROGRESSIVE PLAYBACK " + extra);
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Log.d("MediaPlayer Error", "MEDIA ERROR SERVER DIED " + extra);
break;
}
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mp != null) {
stopMedia();
mp.release();
}
removeAudioFocus();
wifiLock.release();
}
我的列表视图侦听器:
lv_tracks.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
mSelectedTrackTitle.setText(stations[position]);
nowplaying.setText("Now Playing");
mPlayerControl.setImageResource(R.drawable.ic_pause_circle_filled);
Resources res = getResources();
String[] links = res.getStringArray(R.array.links);
String url = links[position];
if(!serviceBound) {
Intent playerIntent = new Intent(MainActivity.this, MpService.class);
playerIntent.putExtra("media", url);
startService(playerIntent);
bindService(playerIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
}
});
我需要设置nowplaying.setText(“ Offline”);收音机坏了。早些时候,我在错误侦听器中实现了这一点。但是我如何使我的textview附加服务? 请帮忙!!! 当前,媒体播放器正在选择第一个项目,但是在选择其他类似这些子序列的操作时起作用,但是url并没有改变,或者可能要花一些时间才能使人困惑。
mSelectedTrackTitle.setText(stations[position]);
nowplaying.setText("Now Playing");
mPlayerControl.setImageResource(R.drawable.ic_pause_circle_filled);