位置 getLastKnownLocation 返回 null

时间:2021-07-05 16:32:04

标签: java android android-studio

你好,我想使用 getlocation 在线创建一个 attandace 一切正常,直到我关闭应用程序并忘记打开 GPS 服务

每次我打开活动以获取地理定位代码总是失败, 我要问的是如何使用谷歌地图 api 获取当前位置,所以每次我打开应用程序都可以获取位置地理编码

请帮助我努力解决这个问题,我的最终项目需要这个应用程序

 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

这是我的代码:

@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 工作正常,但这不是我所期望的

@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);

1 个答案:

答案 0 :(得分:0)

Android 10 引入了称为后台位置的新权限: https://developer.android.com/training/location/permissions#background

对于 Android 10 或更高版本的设备,要在应用处于后台时获取位置:

  1. 您需要在清单中声明后台位置权限。
  2. 用户必须在运行时授予此权限。
  3. (更新)必须在设备上启用位置服务。

(更新)示例代码:

AndroidManifest.xml(在 manifest 标签中)声明精细和后台权限:

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

这是您从 Activity 类请求这些权限的方式(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);

这是检查 Android 10+ 设备(2 级权限)的活动结果的方法:

// 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)

对于 Android 6-9 设备,您只需检查 Manifest.permission.ACCESS_FINE_LOCATION

相关问题