Open GPS In Android Like Google MAP With React Native
June 23, 2021
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;
}