GPS-ისა და Internet-ის მდგომარეობის ცვლილებების event-ები android-ში

მოგესალმებით, სანამ უშუალოდ დავიწყებდე მაგალითის ჩვენებას, თუ როგორ უნდა გავიგოთ რა დროს ჩავრთეთ/გამოვრთეთ GPS ან Internet-ი ჩვენს ანდროიდ მოწყობილობაზე ჩვენივე დაწერილი აპლიკაციით, მინდა მოკლედ მოგახსენოთ თუ რატომ გადავწყვიტე ამ პოსტის დაწერა.  ერთი თვის წინ, ან თვე-ნახევრის წინ დავიწყე ანდროიდზე კოდის წერა და პროექტების შექმნა. რაღაც დეტალებმა დამაინტერესა. კონკრეტული პროექტის შექმნისას დამჭირდა გამერჩია GPS-თან და Internet-თან მუშაობის ნიუანსები. დამჭირდა გამეგო როგორ შეიძლება მოვუსმინო GPS-ისა და Internet-ის ჩართვა/გამორთვის event-ებს და კოდის ძებნა ინტერნეტში დავიწყე, ახლა კი მინდა ჩემი გამოცდილება გავუზიარო ქართველ მკითხველს და მომავალში საჭიროების შემთხვევაში იმედი მაქვს ეს პოსტი დაეხმარება. ახლა კი საქმეზე გადავიდეთ:

 

არ შევეხები იმას, თუ რა არის Activity, manifest-ფაილი, BroadcastReceiver-ი და ზოგიერთი კლასი, რადგან ეს ფართო თემაა და თან ეს პოსტი არ არის განკუთვნილი.

ჩვენ, რომ ზემოთ ხსენებულ event-ებს მოვუსმინოთ, საჭიროა შევქმნათ ჩვენი Reveiver კლასი, რომელიც იქნება BroadcastReceiver კლასის მემკვიდრე. ვნახოთ ამ კლასის მაგალითი:

package com.example.chalauri.receiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

/**
 * Created by chalauri on 10/8/2016.
 */

public class MyReceiver extends BroadcastReceiver {

    private static String LOG_TAG = "RECEIVERS_DEMO";

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

        boolean internetState = internetState(context);
        if (internetState) {
            Log.i(LOG_TAG, "INTERNET TURNED ON");
        } else {
            Log.i(LOG_TAG, "INTERNET TURNED OFF");
        }

        Boolean gpsState = gpsState(context, intent);
        if (gpsState != null) {
            if (gpsState) {
                Log.i(LOG_TAG, "GPS TURNED ON");
            } else {
                Log.i(LOG_TAG, "GPS TURNED OFF");
            }
        }
    }

    private boolean internetState(Context context) {
        ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
    }

    private Boolean gpsState(Context context, Intent intent) {
        LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

                return true;
            } else {

                return false;
            }
        }

        return null;
    }
}

internetState და gpsState მეთოდები აბრუნებენ boolean ტიპს, რომელის true მნიშვნელობა განსაზღვრავს იმას, რომ GSP და Internet-ი ჩართულია. დანარჩენ შემთხვევაში პასუხი უარყოფითია. აქვე არ დაგვავიწყეს, რომ ჩვენ ჩვენი MyReceiver კლასი უნდა დავარეგისტრიროთ manifest ფაილში როგორც receiver-ი და ამავე ფაილში უნდა ჩავწეროთ რომ ჩვენი აპლიკაცია მოითხოვს Internet-სა და GPS-ს. ვნახოთ manifest-ის მაგალითი:

<pre><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chalauri.receiverdemo">


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


<action android:name="android.location.PROVIDERS_CHANGED" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

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

<action android:name="android.location.PROVIDERS_CHANGED" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>

</manifest>

ხოლო დანარჩენ ფაილებს არ ვეხებით და ვტოვებთ ისე, როგორც სტანდარტულად Android Studio ქმნის ხოლმე.