Служба Android: определите, доступно ли подключение для передачи данных по Wi-Fi или мобильным данным. - PullRequest
0 голосов
/ 08 ноября 2018

Как я могу определить непрерывно или по расписанию, доступно ли подключение для передачи данных по Wi-Fi или мобильным данным?

Мне нужно обнаружить его, даже если приложение попадает на передний план, в фоновый режим или убивается системой или пользователем.

Я уже видел много релевантных вопросов и примеров кода, но они говорят, что в Android N и выше ситуация изменилась по соображениям безопасности.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Попробуйте ниже код ....

    Boolean  bs_netcheck=false;
    bs_netcheck = netCheck();
    if(!bs_netcheck)
    {
        displayAlert();
    }

public void displayAlert()
{

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setMessage("Internet Connection Required...! \nPlease Check Your Internet Connection and Try Again");
    TextView title = new TextView(MainActivity.this);
    title.setText("Network Error");
    title.setBackgroundColor(R.color.colorAccent);
    title.setPadding(20, 20, 20, 20);
    title.setGravity(Gravity.CENTER);
    title.setTextColor(Color.WHITE);
    title.setTextSize(20);
    builder.setCustomTitle(title)
            .setPositiveButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton){
                            finishAffinity();
                        }
                    });
    builder.show();
}

public boolean netCheck()
{
    ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    assert conMgr != null;
    if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
            || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED ) {
//notify user you are not online
        bs_netcheck =true;

    }
    return bs_netcheck;
}

Добавить разрешение ниже в AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
0 голосов
/ 08 ноября 2018
//This is your service class working fine just add network state permission in your manifest and at runtime

    public class MyService extends Service {
        private static final String TAG = "MyService";
        private ServiceHandler serviceHandler;
        private static final int MSG_REQUEST = 1112;
        static Context context1;
        public static void startService(Context context) {
            context1=context;
            Intent myIntent = new Intent(context, MyService.class);
            context.startService(myIntent);
        }

        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }


        private class ServiceHandler extends Handler {
            ServiceHandler(Looper looper) {
                super(looper);
            }

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case MSG_REQUEST:
                        checkNetwork();
                        break;
                }
            }
        }

        private void checkNetwork() {
        ConnectivityManager cm = (ConnectivityManager)context1.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        String networkType = "";
        if (info.getType() == ConnectivityManager.TYPE_WIFI) {
            Log.d("yahooooooo","WIFI");
        }
        else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

            networkType = "mobile";
            Log.d("yahooooooo","MOBILE");
        }
     if (!serviceHandler.hasMessages(MSG_REQUEST)) {
            serviceHandler.sendEmptyMessageDelayed(MSG_REQUEST, 1000);//every 1 sec
        }

        }

        @Override
        public void onCreate() {
            super.onCreate();
            HandlerThread handlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
            handlerThread.start();
            serviceHandler = new ServiceHandler(handlerThread.getLooper());
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (!serviceHandler.hasMessages(MSG_REQUEST)) {
                serviceHandler.sendEmptyMessage(MSG_REQUEST);
            }


            return START_REDELIVER_INTENT;
        }

        @Override
        public void onTaskRemoved(Intent rootIntent) {
            super.onTaskRemoved(rootIntent);

            PendingIntent service = PendingIntent.getService(
                    getApplicationContext(),
                    1001,
                    new Intent(getApplicationContext(), MyService.class),
                    PendingIntent.FLAG_ONE_SHOT);

            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            assert alarmManager != null;
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service);
        }

    }

// Теперь звоните в сервис из Activity

    MyService.startService(MainActivity.this);

// В манифесте

    <service
    android:name=".MyService"
    tools:ignore="InnerclassSeparator" />
...