Как справиться с онлайн-медиаплеером при изменении состояния сети (сеть переключается между Wi-Fi или мобильными данными)? - PullRequest
0 голосов
/ 26 октября 2018

В моем приложении есть медиаплеер, который воспроизводит потоковую ссылку.Проигрыватель запускается методом oncreate, когда доступно подключение к Интернету. У меня есть радиовещательный приемник, который проверяет подключение к Интернету и уведомляет пользователя.Я столкнулся с проблемой, заключающейся в том, что, когда мое приложение переключается с Wi-Fi на сотовую сеть, медиаплеер должен сделать небольшую паузу и запустить снова, потому что сеть снова доступна.Но я не могу найти логику, как я могу этого достичь?Вот мой пример кода, пожалуйста, решить проблему?Любая помощь будет благодарна.

Манифест:

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

    <receiver android:name=".receivers.NetworkChangeReciever">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

Основная деятельность:

private BroadcastReceiver mNetworkReceiver;
    static TextView tv_check_connection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_check_connection=(TextView) findViewById(R.id.tv_check_connection);
        mNetworkReceiver = new NetworkChangeReciever();
        registerNetworkBroadcastForNougat();

       // checkNetworkStatus();

        mSelectedTrackTitle = (TextView) findViewById(R.id.selected_track_title);
        nowplaying = (TextView) findViewById(R.id.nowplaying);
        mPlayerControl = (ImageView) findViewById(R.id.player_control);
        mPlayerControl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                togglePlayPause();
            }
        });

        mSelectedTrackTitle.setText("FM World Pakistan");
        nowplaying.setText("Now Playing");
        mPlayerControl.setImageResource(R.drawable.ic_pause_circle_filled);

            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            try {
                mMediaPlayer.setDataSource(url);
                mMediaPlayer.prepare();
                mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mMediaPlayer.start();
                    }
                });

            } catch (IOException e) {
                e.printStackTrace();
                nowplaying.setText("Offline");
                Toast.makeText(MainActivity.this, "Radio Offline", Toast.LENGTH_LONG).show();
                mPlayerControl.setImageResource(R.drawable.ic_play_circle_filled);
            }
public static void dialog(boolean value){

        if(value){
            tv_check_connection.setText("We are back !!!");
            tv_check_connection.setBackgroundResource(R.color.neton);
            tv_check_connection.setTextColor(Color.WHITE);

            Handler handler = new Handler();
            Runnable delayrunnable = new Runnable() {
                @Override
                public void run() {
                    tv_check_connection.setVisibility(View.GONE);
                }
            };
            handler.postDelayed(delayrunnable, 3000);
        }else {
            tv_check_connection.setVisibility(View.VISIBLE);
            tv_check_connection.setText("Could not connect to Internet.");
            tv_check_connection.setBackgroundResource(R.color.colorAccent);
            tv_check_connection.setTextColor(Color.WHITE);
            nowplaying.setText("Buffering...");
            mPlayerControl.setImageResource(R.drawable.ic_play_circle_filled);
        }
    }


    private void registerNetworkBroadcastForNougat() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }
    }

    protected void unregisterNetworkChanges() {
        try {
            unregisterReceiver(mNetworkReceiver);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
private void togglePlayPause() {
        if (mMediaPlayer.isPlaying()) {
           mMediaPlayer.pause();
            nowplaying.setText("Offline");
            mPlayerControl.setImageResource(R.drawable.ic_play_circle_filled);
        } else {
            mMediaPlayer.start();
            nowplaying.setText("Now Playing");
            mPlayerControl.setImageResource(R.drawable.ic_pause_circle_filled);
       }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterNetworkChanges();
        if (mMediaPlayer != null) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
            }
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

Класс получателя:

public class NetworkChangeReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try
        {
            if (isOnline(context)) {
                dialog(true);
                Log.e("Hi", "Online Connect Intenet ");
            } else {
                dialog(false);
                Log.e("Sorry","Conectivity Failure !!! ");
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }

    }
    private boolean isOnline(Context context) {
        try {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            //should check null because in airplane mode it will be null
            return (netInfo != null && netInfo.isConnected());
        } catch (NullPointerException e) {
            e.printStackTrace();
            return false;
        }
    }

1 Ответ

0 голосов
/ 27 октября 2018

Я нашел решение, если медиаплеер объявлен как статический;мы можем переинициализировать его в dialog()

публичном диалоге статических пустот (логическое значение) {

     if(value){
            tv_check_connection.setText("We are back !!!");
            tv_check_connection.setBackgroundResource(R.color.neton);
            tv_check_connection.setTextColor(Color.WHITE);
//recreate media player

            Handler handler = new Handler();
            Runnable delayrunnable = new Runnable() {
                @Override
                public void run() {
                    tv_check_connection.setVisibility(View.GONE);
                }
            };
            handler.postDelayed(delayrunnable, 3000);
        }else {
            tv_check_connection.setVisibility(View.VISIBLE);
            tv_check_connection.setText("Could not connect to Internet.");
            tv_check_connection.setBackgroundResource(R.color.colorAccent);
            tv_check_connection.setTextColor(Color.WHITE);
            nowplaying.setText("Buffering...");
            mPlayerControl.setImageResource(R.drawable.ic_play_circle_filled);
//pause media player
        }
    }
...