Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Android GPS और Location Manager ट्यूटोरियल

Android GPS और Location Manager का उपयोग कैसे करें

यह उदाहरण दर्शाता है कि Android में GPS और Location Manager का उपयोग करके उपयोगकर्ता की वर्तमान लोकेशन कैसे प्राप्त की जाती है। हम Fused Location Provider API का उपयोग करेंगे जो Google Play Services का हिस्सा है और बेहतर सटीकता और बैटरी दक्षता प्रदान करता है।

चरण 1: नया प्रोजेक्ट बनाएं

Android Studio खोलें, File → New Project पर जाएं और सभी आवश्यक विवरण भरकर एक नया प्रोजेक्ट बनाएं।

चरण 2: लेआउट फ़ाइल में UI जोड़ें

res/layout/activity_main.xml में निम्न कोड जोड़ें:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_start_location_updates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:onClick="startLocationButtonClick"
        android:text="@string/start_updates" />

    <Button
        android:id="@+id/btn_stop_location_updates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:enabled="false"
        android:onClick="stopLocationButtonClick"
        android:text="@string/stop_updates" />

    <Button
        android:id="@+id/btn_get_last_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:onClick="showLastKnownLocation"
        android:text="@string/get_last_location" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center_horizontal"
        android:text="लोकेशन अपडेट केवल तब प्राप्त होंगे जब ऐप फोरग्राउंड में हो" />

    <TextView
        android:id="@+id/location_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textColor="#333"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/updated_on"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:textSize="12sp" />

</LinearLayout>

चरण 3: MainActivity.java में लॉजिक जोड़ें

src/MainActivity.java में निम्न कोड जोड़ें:

package app.com.sample;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.net.Uri;
import android.os.Bundle;
import android.os.Looper;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.LocationSettingsStatusCodes;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.text.DateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    TextView txtLocationResult;
    TextView txtUpdatedOn;
    Button btnStartUpdates;
    Button btnStopUpdates;
    
    // लोकेशन अंतिम अपडेट समय
    private String mLastUpdateTime;
    
    // लोकेशन अपडेट अंतराल - 10 सेकंड
    private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
    
    // सबसे तेज़ अपडेट अंतराल - 5 सेकंड
    private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 5000;
    
    private static final int REQUEST_CHECK_SETTINGS = 100;
    
    // लोकेशन संबंधी APIs
    private FusedLocationProviderClient mFusedLocationClient;
    private SettingsClient mSettingsClient;
    private LocationRequest mLocationRequest;
    private LocationSettingsRequest mLocationSettingsRequest;
    private LocationCallback mLocationCallback;
    private Location mCurrentLocation;
    
    // UI टॉगल के लिए बूलियन फ्लैग
    private Boolean mRequestingLocationUpdates;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // आवश्यक लाइब्रेरी इनिशियलाइज़ करें
        init();
        
        // सेव्ड इंस्टेंस स्टेट से मान पुनर्स्थापित करें
        restoreValuesFromBundle(savedInstanceState);
    }

    private void init() {
        txtLocationResult = findViewById(R.id.location_result);
        txtUpdatedOn = findViewById(R.id.updated_on);
        btnStartUpdates = findViewById(R.id.btn_start_location_updates);
        btnStopUpdates = findViewById(R.id.btn_stop_location_updates);
        
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        mSettingsClient = LocationServices.getSettingsClient(this);
        
        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                // लोकेशन प्राप्त हुई
                mCurrentLocation = locationResult.getLastLocation();
                mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
                updateLocationUI();
            }
        };
        
        mRequestingLocationUpdates = false;
        
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);
        mLocationSettingsRequest = builder.build();
    }

    /** सेव्ड इंस्टेंस स्टेट से मान पुनर्स्थापित करना */
    private void restoreValuesFromBundle(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("is_requesting_updates")) {
                mRequestingLocationUpdates = savedInstanceState.getBoolean("is_requesting_updates");
            }
            if (savedInstanceState.containsKey("last_known_location")) {
                mCurrentLocation = savedInstanceState.getParcelable("last_known_location");
            }
            if (savedInstanceState.containsKey("last_updated_on")) {
                mLastUpdateTime = savedInstanceState.getString("last_updated_on");
            }
        }
        updateLocationUI();
    }

    /** लोकेशन डेटा प्रदर्शित करने और बटन टॉगल करने के लिए UI अपडेट करें */
    private void updateLocationUI() {
        if (mCurrentLocation != null) {
            txtLocationResult.setText(
                "Lat: " + mCurrentLocation.getLatitude() + ", " +
                "Lng: " + mCurrentLocation.getLongitude()
            );
            // TextView पर ब्लिंक एनिमेशन
            txtLocationResult.setAlpha(0);
            txtLocationResult.animate().alpha(1).setDuration(300);
            // लोकेशन अंतिम अपडेट समय
            txtUpdatedOn.setText("Last updated on: " + mLastUpdateTime);
        }
        toggleButtons();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("is_requesting_updates", mRequestingLocationUpdates);
        outState.putParcelable("last_known_location", mCurrentLocation);
        outState.putString("last_updated_on", mLastUpdateTime);
    }

    private void toggleButtons() {
        if (mRequestingLocationUpdates) {
            btnStartUpdates.setEnabled(false);
            btnStopUpdates.setEnabled(true);
        } else {
            btnStartUpdates.setEnabled(true);
            btnStopUpdates.setEnabled(false);
        }
    }

    /** लोकेशन अपडेट शुरू करना
     * जांचें कि लोकेशन सेटिंग्स संतुष्ट हैं और फिर लोकेशन अपडेट का अनुरोध करें */
    private void startLocationUpdates() {
        mSettingsClient
            .checkLocationSettings(mLocationSettingsRequest)
            .addOnSuccessListener(this, new OnSuccessListener() {
                @SuppressLint("MissingPermission")
                @Override
                public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                    Log.i(TAG, "All location settings are satisfied.");
                    Toast.makeText(getApplicationContext(), "Started location updates!", Toast.LENGTH_SHORT).show();
                    //noinspection MissingPermission
                    mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
                    updateLocationUI();
                }
            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    int statusCode = ((ApiException) e).getStatusCode();
                    switch (statusCode) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade location settings");
                            try {
                                // डायलॉग दिखाएं और onActivityResult() में परिणाम जांचें
                                ResolvableApiException rae = (ResolvableApiException) e;
                                rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                            } catch (IntentSender.SendIntentException sie) {
                                Log.i(TAG, "PendingIntent unable to execute request.");
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            String errorMessage = "Location settings are inadequate, and cannot be fixed here. Fix in Settings.";
                            Log.e(TAG, errorMessage);
                            Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
                    }
                    updateLocationUI();
                }
            });
    }

    public void startLocationButtonClick(View view) {
        // Dexter लाइब्रेरी का उपयोग करके ACCESS_FINE_LOCATION अनुमति मांगना
        Dexter.withActivity(this)
            .withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse response) {
                    mRequestingLocationUpdates = true;
                    startLocationUpdates();
                }
                @Override
                public void onPermissionDenied(PermissionDeniedResponse response) {
                    if (response.isPermanentlyDenied()) {
                        // जब अनुमति स्थायी रूप से अस्वीकार की जाती है तो डिवाइस सेटिंग्स खोलें
                        openSettings();
                    }
                }
                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
    }

    public void stopLocationButtonClick(View view) {
        mRequestingLocationUpdates = false;
        stopLocationUpdates();
    }

    public void stopLocationUpdates() {
        // लोकेशन अपडेट हटाना
        mFusedLocationClient
            .removeLocationUpdates(mLocationCallback)
            .addOnCompleteListener(this, new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    Toast.makeText(getApplicationContext(), "Location updates stopped!", Toast.LENGTH_SHORT).show();
                    toggleButtons();
                }
            });
    }

    public void showLastKnownLocation(View view) {
        if (mCurrentLocation != null) {
            Toast.makeText(getApplicationContext(), 
                "Lat: " + mCurrentLocation.getLatitude() + ", Lng: " + mCurrentLocation.getLongitude(), 
                Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Last known location is not available!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // startResolutionForResult() को मूल रूप से सप्लाई किए गए पूर्णांक अनुरोध कोड की जांच करें
        if (requestCode == REQUEST_CHECK_SETTINGS) {
            switch (resultCode) {
                case Activity.RESULT_OK:
                    Log.e(TAG, "User agreed to make required location settings changes.");
                    // कुछ करने की आवश्यकता नहीं। onResume में फिर से startLocationUpdates() कॉल होगा।
                    break;
                case Activity.RESULT_CANCELED:
                    Log.e(TAG, "User chose not to make required location settings changes.");
                    mRequestingLocationUpdates = false;
                    break;
            }
        }
    }

    private void openSettings() {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null);
        intent.setData(uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    @Override
    public void onResume() {
        super.onResume();
        // बटन स्टेट और अनुमत अनुमतियों के आधार पर लोकेशन अपडेट फिर से शुरू करना
        if (mRequestingLocationUpdates && checkPermissions()) {
            startLocationUpdates();
        }
        updateLocationUI();
    }

    private boolean checkPermissions() {
        int permissionState = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
        return permissionState == PackageManager.PERMISSION_GRANTED;
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mRequestingLocationUpdates) {
            // लोकेशन अपडेट रोकना
            stopLocationUpdates();
        }
    }
}

चरण 4: AndroidManifest.xml में अनुमतियां जोड़ें

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
        
    </application>
</manifest>

ऐप चलाएं

अपने Android डिवाइस को कंप्यूटर से कनेक्ट करें। Android Studio में प्रोजेक्ट की एक्टिविटी फ़ाइल खोलें और टूलबार से Run आइकन पर क्लिक करें। अपना मोबाइल डिवाइस चुनें और डिवाइस पर डिफ़ॉल्ट स्क्रीन देखें।

  1. एंड्रॉइड डिवाइस पर GPS लोकेशन सिम्युलेट कैसे करें एंड्रॉइड डिवाइस पर GPS लोकेशन सिम्युलेट कैसे करें

    सभी एंड्रॉइड डिवाइस GPS सपोर्ट के साथ आते हैं, और यही गूगल मैप्स, उबर, फेसबुक, जोमैटो आदि जैसे ऐप्स को आपकी लोकेशन ट्रैक करने की अनुमति देता है। GPS ट्रैकिंग बहुत महत्वपूर्ण है क्योंकि यह आपको आपकी लोकेशन के लिए प्रासंगिक जानकारी प्राप्त करने की अनुमति देता है जैसे मौसम, स्थानीय समाचार, ट्रैफिक स्थि

  1. Android डिवाइस पर अपनी GPS लोकेशन को सुरक्षित रूप से स्पूफ कैसे करें Android डिवाइस पर अपनी GPS लोकेशन को सुरक्षित रूप से स्पूफ कैसे करें

    आप निश्चित रूप से अपने GPS निर्देशांक किसी ऐसे व्यक्ति के साथ साझा नहीं करेंगे जो आपके लिए पूर्ण अजनबी है, है ना? तो फिर आप लगातार ऐप्स को अपने स्थान डेटा तक पहुंचने की अनुमति क्यों दे रहे हैं? क्या आपको कोई अंदाजा है कि आपका डेटा कहां संग्रहीत है? क्या आप डेटा संग्रहीत करने वाले सिस्टम की सुरक्षा म

  1. एंड्रॉयड के लिए शीर्ष 6 विश्वसनीय फेक GPS ऐप्स - सुरक्षित और विश्वसनीय लोकेशन स्पूफिंग एंड्रॉयड के लिए शीर्ष 6 विश्वसनीय फेक GPS ऐप्स - सुरक्षित और विश्वसनीय लोकेशन स्पूफिंग

    GPS किसी भी स्मार्टफोन की वर्तमान लोकेशन खोजने का सबसे अच्छा तरीका है। इसके अलावा, अधिकांश एंड्रॉयड ऐप्स बेहतर प्रदर्शन के लिए लोकेशन एक्सेस परमिशन मांगते हैं। इसके अलावा, कुछ एप्लिकेशन आपको मुख्य स्क्रीन पास नहीं करने देंगे यदि आप उन्हें अनुमति नहीं देते। इस प्रकार, उनमें से कुछ को लोकेशन एक्सेस दे