Reputation: 31
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
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:
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