首页 > 解决方案 > 位置 getLastKnownLocation 返回 null

问题描述

您好,我想使用 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);

标签: javaandroidandroid-studio

解决方案


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


推荐阅读