Проверьте сетевое соединение с вещательным приемником и запустите alerttdialog, если оно потеряно - PullRequest
0 голосов
/ 13 июня 2019

Существует множество вопросов StackOverflow о том, как проверить сетевое подключение, на которые легко ответить, прочитав это в документации Android: https://developer.android.com/training/basics/network-ops/managing#check-connection

Это, однако, не цель этого вопроса. Здесь мне нужно знать, как прослушивать изменения соединения во всех действиях приложения, чтобы всякий раз, когда сеть полностью терялась (давайте не будем понимать, что Wi-Fi или мобильные данные «полностью потеряны»), приложение должно предупреждать пользователя с помощью AlertDialog, что сеть необходима для продолжения использования приложения.

Я пытался добиться этого с помощью BroadcastReceiver, который динамически регистрируется в классе, который расширяет android.app.Application, но когда приложение теряет сеть, оно закрывается, и я получаю эту строку ошибки в Logcat:

E/Auth: [GoogleAccountDataServiceImpl] getToken() -> BAD_AUTHENTICATION. Account: <ELLIDED:267257377>, App: com.google.android.gms, Service: oauth2:https://www.googleapis.com/auth/contextcontroller

Это мой класс BroadcastReceiver:

public class NetworkBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {


        if(!isConnected(context)) {

            buildDialog(context).show();
        }

    }


    public boolean isConnected(Context context) {

        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnected());
    }

    public AlertDialog.Builder buildDialog(Context c) {

        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setTitle("No Internet Connection");
        builder.setMessage("You need to have Mobile Data or wifi to access this. Press ok to Exit");

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();
            }
        });

        return builder;
    }
}

Это класс, который расширяет android.app.Application:

public class MyApp extends Application {

    private NetworkBroadcastReceiver mNetworkBroadcastReceiver = new NetworkBroadcastReceiver();

    @Override
    public void onCreate() {
        super.onCreate();

        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(mNetworkBroadcastReceiver, filter);

    }

}

И да, у меня есть разрешение ACCESS_NETWORK_STATE, объявленное в файле манифеста приложения.

Как вы думаете, ошибка связана с объявлением BroadcastReceiver в MyApp или вы думаете, что это происходит из-за AlertDialog внутри моего класса BroadcastReceiver?

Предупреждение: я не хочу регистрировать и отменять регистрацию BroadcastReceiver во всех моих действиях, суть этого вопроса в том, чтобы найти решение для быстрого доступа, чтобы BroadcastReceiver можно было раз и навсегда зарегистрировать из одного места для всех действий .

...