Agam
Agam

Reputation: 31

Location getLastKnownLocation return null

hello i wanna create a attandace online using getlocation everything works fine until i close the app and forget to turn on the GPS service

everytime i open activity to get geoLocation code is always failed , what i ask is how can in get current location using google maps api so everytime i open the apps is works to get location geocodes

Please Help Im struggle to solve this i need this app for my final project

 java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
        at com.sistemabsensi.online.Absensi.onConnected(Absensi.java:415)
        at com.google.android.gms.common.internal.GmsClientEventManager.onConnectionSuccess(Unknown Source:33)
        at com.google.android.gms.common.api.internal.zaaw.zab(Unknown Source:292)
        at com.google.android.gms.common.api.internal.zaak.zaaq(Unknown Source:125)
        at com.google.android.gms.common.api.internal.zaak.onConnected(Unknown Source:105)
        at com.google.android.gms.common.api.internal.zabe.onConnected(Unknown Source:101)
        at com.google.android.gms.common.api.internal.zaq.onConnected(Unknown Source:6)
        at com.google.android.gms.common.internal.zaf.onConnected(Unknown Source:2)
        at com.google.android.gms.common.internal.BaseGmsClient$zzf.zzm(Unknown Source:24)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(Unknown Source:12)
        at com.google.android.gms.common.internal.BaseGmsClient$zzc.zzo(Unknown Source:11)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.handleMessage(Unknown Source:49)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at com.google.android.gms.internal.common.zze.dispatchMessage(Unknown Source:8)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
I/Process: Sending signal. PID: 27425 SIG: 9

Heres My code :

@Override
public void onConnected(@Nullable Bundle bundle) {
if (ContextCompat.checkSelfPermission(this,
    android.Manifest.permission.ACCESS_FINE_LOCATION)
    == PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
            }
             LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
            @SuppressLint("MissingPermission") Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            double latit = location.getLatitude();
            double longit = location.getLongitude();
            LatLng kantor = new LatLng(-8.4603894,118.7560158);
            LatLng User = new LatLng(latit,longit);
            distance=SphericalUtil.computeDistanceBetween(User,kantor);
            TextView jarak = findViewById(R.id.jarak);    
            jarak.setText("Jarak Dari Kantor :" + Math.round(distance) + " Meter");
            Log.d(TAG,"Latitude" + String.valueOf(latit)  +"Longitude" + String.valueOf(longit));

On Location Change works fine but this not i expected

@Override
    public void onLocationChanged(Location location) {
        mLastLocation = location;
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

        CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(latLng.latitude, latLng.longitude)).zoom(16).build();
        latitude = location.getLatitude();
        longitude = location.getLongitude();

        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        @SuppressLint("MissingPermission") Location location1 = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        double latit = location.getLatitude();
        double longit = location.getLongitude();
        float[] results  = new float[1];
        Location.distanceBetween(latit,longit,-8.4604926,118.7560354,results);
        float distance = results[0];
        int meter = (int) (distance/10000);
        TextView jarak = findViewById(R.id.jarak);

Upvotes: 1

Views: 199

Answers (1)

Shlomi Katriel
Shlomi Katriel

Reputation: 2403

Android 10 introduced new permission called background location: https://developer.android.com/training/location/permissions#background

For Android 10 devices or above, to get location while app is in background:

  1. You need to declare Background Location permission in manifest.
  2. Users must grant this permission in runtime.
  3. (Update) Location services must be enabled on device.

(Update) Sample code:

Declare fine and background permission in AndroidManifest.xml (in manifest tag):

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

This is how you request these permissions from your Activity class (no permissions before Android 6):

// Android 10+
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION}, REQUEST_CODE);

// Android 6-9
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);

This is how you check the result from your activity for Android 10+ devices (2 levels of permissions):

// Utility function
@RequiresApi(api = Build.VERSION_CODES.M)
public boolean isPermissionGranted(String permission) {
    return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}

// Only fine location granted - no location if app is closed
isPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION) && !isPermissionGranted(Manifest.permission.ACCESS_BACKGROUND_LOCATION)

// Fine & background location granted - location should (almost) always work:
isPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION) && isPermissionGranted(Manifest.permission.ACCESS_BACKGROUND_LOCATION)

For Android 6-9 devices you can just check for Manifest.permission.ACCESS_FINE_LOCATION

Upvotes: 1

Related Questions