Подключение к Интернету через Android во всех версиях Android - PullRequest
0 голосов
/ 05 июня 2019

Я ищу способ проверить и прослушать свое интернет-соединение, но поскольку последняя версия Android не поддерживает регистрацию трансляции в манифесте, я ищу способ реализовать что-то, что работает на всех версиях Android,До сих пор я не мог найти никаких решений.

Я пытался добавить фильтр намерений Broadcast в свой файл манифеста, но это не разрешено в более поздних версиях Android.

<receiver
            android:name="utilities.NetworkStateChangeReceiver"
            android:exported="true"
            android:enabled="true"
            android:label="NetworkConnection" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.STATE_CHANGE"/>
            </intent-filter>
        </receiver>

public class NetworkStateChangeReceiver extends BroadcastReceiver {
    public static final String NETWORK_AVAILABLE_ACTION = "NetworkAvailable";
    public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable";

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION);
        networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isConnectedToInternet(context));
        LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent);
    }

    private boolean isConnectedToInternet(Context context) {
        final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        boolean isMobile = false, isWifi = false;

        NetworkInfo[] infoAvailableNetworks = cm.getAllNetworkInfo();

        if (infoAvailableNetworks != null) {
            for (NetworkInfo network : infoAvailableNetworks) {

                if (network.getType() == ConnectivityManager.TYPE_WIFI) {
                    if (network.isConnected() && network.isAvailable())
                        isWifi = true;
                }
                if (network.getType() == ConnectivityManager.TYPE_MOBILE) {
                    if (network.isConnected() && network.isAvailable())
                        isMobile = true;
                }
            }
        }

        return isMobile || isWifi;
    }
}

Мой ресивер не может принимать трансляции

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Если вы хотите проверить подключение к интернету, все ваши действия вы можете выполнить ниже код: -

NetworkSchedulerService.java

public class NetworkSchedulerService extends JobService implements
        ConnectivityReceiver.ConnectivityReceiverListener {

    private static final String TAG = NetworkSchedulerService.class.getSimpleName();

    private ConnectivityReceiver mConnectivityReceiver;


    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service created");
        prefManager = PrefManager.getInstance(this);
        mConnectivityReceiver = new ConnectivityReceiver(this);
    }
    /**
     * When the app's NetworkConnectionActivity is created, it starts this service. This is so that the
     * activity and this service can communicate back and forth. See "setUiCallback()"
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        return START_NOT_STICKY;
    }


    @Override
    public boolean onStartJob(JobParameters params) {
        Log.i(TAG, "onStartJob" + mConnectivityReceiver);
        registerReceiver(mConnectivityReceiver, new IntentFilter(CONNECTIVITY_ACTION));
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.i(TAG, "onStopJob");
        unregisterReceiver(mConnectivityReceiver);
        return true;
    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        if(isConnected){
            Toast.makeText(this,"connected to internet",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this,"no internet connection",Toast.LENGTH_SHORT).show();
     }
    }
}

В файле манифеста

<service
                android:name=".NetworkSchedulerService"
                android:exported="true"
                android:permission="android.permission.BIND_JOB_SERVICE"/>```

создать класс приложения

class MyApplication extends Application {
 override fun onCreate() {
        super.onCreate()
             scheduleJob()
    }
override fun onStop() {
        super.onStop()
         // A service can be "started" and/or "bound". In this case, it's "started" by this Activity
        // and "bound" to the JobScheduler (also called "Scheduled" by the JobScheduler). This call
        // to stopService() won't prevent scheduled jobs to be processed. However, failing
        // to call stopService() would keep it alive indefinitely.
        stopService(Intent(this, NetworkSchedulerService::class.java))
    }

override fun onStart(){
 val startServiceIntent = Intent(this, NetworkSchedulerService::class.java)
            startService(startServiceIntent)
}

 private fun scheduleJob() {
        val myJob = JobInfo.Builder(0, ComponentName(this, NetworkSchedulerService::class.java))
            .setRequiresCharging(true)
            .setMinimumLatency(1000)
            .setOverrideDeadline(2000)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true)
            .build()

        val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
        jobScheduler.schedule(myJob)
    }


}

определить класс приложения в файле манифеста

Класс BroadcastReceiver ->

public class ConnectivityReceiver extends BroadcastReceiver {

    private ConnectivityReceiverListener mConnectivityReceiverListener;

    ConnectivityReceiver(ConnectivityReceiverListener listener) {
        mConnectivityReceiverListener = listener;
    }


    @Override
    public void onReceive(Context context, Intent intent) {
        mConnectivityReceiverListener.onNetworkConnectionChanged(isConnected(context));

    }

    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }

    public interface ConnectivityReceiverListener {
        void onNetworkConnectionChanged(boolean isConnected);
    }
}

** onNetworkConnectionChanged уведомит, когда Интернет подключен или нет (NetworkSchedulerService.java) Не определяйте BroadCastReceiver в файле манифеста. убедитесь, что вы предоставили разрешение interect, CHANGE_NETWORK_STATE, ACCESS_NETWORK_STATE **

Надеюсь, это поможет вам. Дайте мне знать, если есть любая проблема . Счастливое кодирование: -)

0 голосов
/ 05 июня 2019

Я использую почти такую ​​же логику с IntentFilter, и она работает для меня довольно хорошо без регистрации в файле Manifest.

Интерфейс:

public interface IReceiverStateChange {

    void register(BroadcastReceiver broadcastReceiver);
    void unregister(BroadcastReceiver broadcastReceiver);
}

Реализация:

public class NetworkReceiverStateChange implements IReceiverStateChange {

    private Context mContext;
    private Boolean mIsRegistered = false;

    public NetworkReceiverStateChange(Context context) {
        mContext = context;
    }

    @Override
    public void register(BroadcastReceiver broadcastReceiver) {
        if (!mIsRegistered) {
            IntentFilter netWorkIntentFilter = new 
            IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
            mContext.registerReceiver(broadcastReceiver, netWorkIntentFilter);
            mIsRegistered = true;
        }
    }

    @Override
    public void unregister(BroadcastReceiver broadcastReceiver) {
        if (mIsRegistered) {
            mContext.unregisterReceiver(broadcastReceiver);
            mIsRegistered = false;
        }
    }
}

Зарегистрируйтесь в желаемой деятельности:

if (mNetworkStateChange == null) {
            mNetworkStateChange = new NetworkReceiverStateChange(this);
        }
        mNetworkStateChange.register(mNetworkBroadcastReceiver);

Отменить регистрацию в onDestroy:

if (mNetworkStateChange != null) {
            mNetworkStateChange.unregister(mNetworkBroadcastReceiver);
        }

BroadcastReceiver Obj:

    //The CONNECTIVITY_ACTION broadcast seems to be sticky on some devices (even 
      though the documentation implies that it is not).
    // This means that when you register the receiver it will immediately call 
       onReceive() with the most recently sent broadcast.
private final BroadcastReceiver mNetworkBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action != null && action.matches("android.net.conn.CONNECTIVITY_CHANGE")) {
                <DO SOMETHING>
            }
        }
    };

Надеюсь, это поможет:)

...