Open GPS In Android Like Google MAP With React Native

June 23, 2021

Open GPS In Android Like Google MAP With React Native

Open GPS In Android Like Google MAP With React Native

App.js

const {GpsUtils}=NativeModules;




const getOneTimeLocation = () => new Promise((reslove)=>{
            Geolocation.getCurrentPosition(
              (position) => {
                 reslove(position)
              },    
              (error) => {
                console.log(error);
                if (error.code === NO_LOCATION_PROVIDER_AVAILABLE) {
                    if(Platform.OS==='android'){
                         GpsUtils.CheckFxn(); 
                    }else{
                      console.info('implment ios logic here')
                    }
               } 
              },{ enableHighAccuracy: true, timeout: 20000, maximumAge: 100, distanceFilter: 10, showLocationDialog: true,},
            )
          })

AndroidManifest.xml

    <!--PERMISSION FOR API SERVICES-->
    <uses-permission android:name="android.permission.INTERNET" />
    
    <!--PERMISSION FOR GPS-->
    <uses-permission android:name="android.permission.ACCESS_GPS" />

    <!--PERMISSIONS FOR LOCATION-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

android/app/src/main/java/com/awesomeproject/GpsUtils.java

package com.awesomeproject;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.widget.Toast;


import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.LocationRequest;
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.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

public class GpsUtils extends ReactContextBaseJavaModule {

    public GpsUtils(ReactApplicationContext reactContext) {
        super(reactContext);
    }
    protected static final int REQUEST_CHECK_SETTINGS = 0x1;
    @Override
    public String getName() {
        return "GpsUtils";
    }


    @ReactMethod
    public void CheckFxn() {

        final Activity activity = getCurrentActivity();

        if (activity != null) {
            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(30 * 1000);
            locationRequest.setFastestInterval(5 * 1000);

            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);
            builder.setAlwaysShow(true); //this is the key ingredient

            Task<LocationSettingsResponse> result =
                    LocationServices.getSettingsClient(getReactApplicationContext()).checkLocationSettings(builder.build());

            result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>()
            {
                @Override
                public void onComplete(Task<LocationSettingsResponse> task)
                {
                    try {
                        LocationSettingsResponse response = task.getResult(ApiException.class);
                        // All location settings are satisfied. The client can initialize location
                        // requests here.

                    }
                    catch (ApiException exception)
                    {
                        switch (exception.getStatusCode())
                        {
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                // Location settings are not satisfied. But could be fixed by showing the
                                // user a dialog.
                                try {
                                    // Cast to a resolvable exception.
                                    ResolvableApiException resolvable = (ResolvableApiException) exception;
                                    // Show the dialog by calling startResolutionForResult(),
                                    // and check the result in onActivityResult().


                                    resolvable.startResolutionForResult(
                                            activity,
                                            REQUEST_CHECK_SETTINGS);


                                }
                                catch (IntentSender.SendIntentException e)
                                {
                                    // Ignore the error.
                                }
                                catch (ClassCastException e)
                                {
                                    // Ignore, should be an impossible error.
                                }
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                // Location settings are not satisfied. However, we have no way to fix the
                                // settings so we won't show the dialog.

                                break;
                        }
                    }
                }
            });

        }

    }


    void onActivityResult(int requestCode, int resultCode, Intent data) {

       
    }

        }

android/app/src/main/java/com/awesomeproject/Main.kt

This is used for create brigde for react native module with Kotlin

package com.awesomeproject.ReactPackage

import android.app.Activity
import com.awesomeproject.GpsUtils
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
import java.util.*
import java.util.Collections.emptyList


class Main : ReactPackage {


    private var mActivity: Activity? = null

    fun CustomReactPackage(activity: Activity?) {
        mActivity = activity
    }
    override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
        return emptyList()
    }

    override fun createNativeModules(
            reactContext: ReactApplicationContext): List<NativeModule> {
        val modules = ArrayList<NativeModule>()

        modules.add(CustomNative(reactContext))
        modules.add(GpsUtils(reactContext))
        return modules
    }

}

android/app/src/main/java/com/awesomeproject/MainApplication.java

Add the Main.kt package to the getPackages() function

   @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // Packages that cannot be autolinked yet can be added manually here, for example:
          packages.add(new Main());
          return packages;
        }

Written by Manoj Bhardwaj who lives and works in Dharamshala Himachal Pradesh (India). My stackoverflow