具有服务的多个电台的在线广播流应用程序

时间:2018-11-09 08:08:14

标签: java android

我为多个电台创建了一个在线广播流应用程序。 我是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);

0 个答案:

没有答案