java - 位置 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);
解决方案
Android 10 引入了称为后台位置的新权限: https ://developer.android.com/training/location/permissions#background
对于 Android 10 或更高版本的设备,在应用处于后台时获取位置:
- 您需要在清单中声明后台位置权限。
- 用户必须在运行时授予此权限。
- (更新)必须在设备上启用位置服务。
(更新)示例代码:
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
推荐阅读
- java - 如何使用 Spring Data JDBC 选择引用的实体
- windows - 将多个输出分配给多个变量并将它们用作输入,批处理文件中另一个程序的每个任务一次
- r - 为什么 ggplot (.predict) 不在 R /rms 包中绘制?
- node.js - Nodejs表达JWT如何从网络/电话客户端(jsonwebtoken)存储和发送令牌
- java - 更新 ArrayList 项的特定属性
- ios - 我可以在我的 Siri 自定义意图中阻止“快捷方式将继续执行您的请求”消息吗?
- autosar - 如何通过在 COM 层保护 PDU 来实现功能安全?
- angular - 为什么构造函数不更新类变量?
- boost-python - 为共享库中的多个 C++ 文件创建 Python 接口时出错
- javascript - 带有代表符号的排序表