【发布时间】:2023-03-14 18:27:02
【问题描述】:
我有一个应用程序,它可以获取用户的当前位置,然后加载谷歌地图并在他们的区域绘制感兴趣的标记。它在 Marshmallow 下面的所有东西上都能完美运行。我已经添加了运行时权限检查,并且在我收到提示时正在设置它们,在我点击接受后,我会从手机的设置中看到应用程序详细信息中列出的权限。但是,我一生都无法弄清楚为什么我没有位置回来。
我正在使用这里看到的示例https://developer.android.com/training/location/retrieve-current.html
我拥有清单中标签设置的所有权限。我什至让我的 Fragment 实现了 LocationListener。但是,永远不会调用 onLocationChanged 方法。我在 Google API 客户端的 onConnected 方法中调用它,如下所示..
@Override
public void onConnected(@Nullable Bundle bundle) {
try {
Log.d("MYAPPTAG","isConnected: " + mGoogleApiClient.isConnected());
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
myLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
} catch (SecurityException ex) {
myLocation = null;
}
}
确实会调用 onConnected 方法,因为我将日志记录到控制台。 myLocation 始终为空。每次我调用 getLastLocation 时,我都会在控制台中收到一条消息,上面写着
No Location to return for getLastLocation()
GoogleSignatureVerifier: com.myappname.android signature not valid. Found: LONG KEY HERE
我需要在 Marshmallow 中做些什么特别的事情吗?
我的 OnLocationChanged 方法
@Override
public void onLocationChanged(Location location) {
myLocation = location;
Log.d("MYAPPTAG", "LocatinChngListner, loc: " + location.getLatitude() + "," + location.getLongitude());
}
AndroidManifest.xml - 权限部分(节点上方)
<!--- App permissions -->
<permission android:name="com.myappname.android.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.myappname.android.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.myappname.android.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myappname.android.permission.C2D_MESSAGE"/>
onCreate 方法 sn-p
createLocationRequest();
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
createLocationRequest 方法
private void createLocationRequest(){
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(1000);
}
onStart() onStop() 方法
@Override
public void onStart() {
if (!mGoogleApiClient.isConnected()) mGoogleApiClient.connect();
super.onStart();
}
@Override
public void onStop() {
if (mGoogleApiClient.isConnected()) mGoogleApiClient.disconnect();
super.onStop();
}
我在 Fragment onCreate 方法之后在下面调用此代码
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1 && (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {
requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }, REQUEST_PERMISSION_USER_LOCATION);
} else {
googleMapsLocationPermissionContainer.setVisibility(View.GONE);
getUserLocationAndInitializeMap();
}
googleMapsLocationPermissionContainer 只是我在地图上覆盖的布局,直到授予权限。
getUserLocationAndInitializeMap()
try {
MapsInitializer.initialize(getActivity());
// Set reference for map object
if (map == null) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
// Here I set the map to invisible then after I plot all the markers I set it to visible again
mapFragment.getView().setVisibility(View.INVISIBLE);
}
} catch (Exception e) {
// Show the google maps alert dialog
showGoogleMapsErrorDialog();
}
【问题讨论】:
-
显示更多代码。我正在做一个带有位置的应用程序,并且在 6.0 上完美运行。我最初的猜测是您需要 android 6.0 的清单权限。在 Android-23 中是另一回事。
-
@AndreiT - 我在 23 岁以上需要哪些清单权限?
-
类似的东西:developer.android.com/training/permissions/requesting.html。我也拥有一切,在 Android-6 中,它只是没有工作,因为我错过了权限调用等等。
-
据我所知(还不是很多知识)在 Android 6 中,您可以禁用和启用应用程序的权限。因此,您需要像以前一样的东西。但在给出答案之前,请输入更多代码。
-
还添加您用于注册位置、GoogleClient 或 GoogleApi 的代码(它们总是更改该死的名称)。
标签: android android-6.0-marshmallow android-maps-v2 android-googleapiclient