问题描述
我试图在片段中使用FusedLocationProviderClient获取设备的当前位置。如果他们接受许可,我希望用户看到当前设备的位置。 问题出在getDeviceLocation()中,该设备检查获取位置是否成功。 logcat不会显示任何错误。
这是Java代码:
public class DirectionsFragment extends Fragment implements OnMapReadyCallback {
GoogleMap mMap;
Boolean mLocationPermissionGranted=false;
public String TAG="DirectionsFragment";
private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
private static final int LOCATION_PERMISSION_CODE = 1234;
private FusedLocationProviderClient mFusedLocationProviderClient;
static final float DEFAULT_ZOOM = 15f;
private Context mContext=getContext();
OnMapReadyCallback callback=new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
Toast.makeText(getContext(),"Map is Ready",Toast.LENGTH_SHORT).show();
mMap = googleMap;
if (mLocationPermissionGranted) {
getDeviceLocation();
if (ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setZoomControlsEnabled(true);
}
}
};
@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
getLocatonPermission();
}
private void getDeviceLocation() {
Log.d(getTag(),"getDeviceLocation:getting device current location");
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(getContext());
try {
if (mLocationPermissionGranted=true) {
if (ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()){
Log.d(TAG,"onComplete:found Location");
Location currentLocation=(Location)task.getResult();
moveCamera(new LatLng(currentLocation.getLatitude(),currentLocation.getLongitude()),DEFAULT_ZOOM);
}else{
Log.d(TAG,"onComplete:current location is null");
Toast.makeText(mContext,"unable to get current location",Toast.LENGTH_SHORT).show();
}
}
});
}
}catch (SecurityException sexc){
Log.e(TAG,"getDeviceLocation:SecurityException:"+sexc.getMessage());
}
}
//What happens on map zoom
private void moveCamera(LatLng latLng,float zoom){
Log.d(TAG,"moveCamera:moving the camera to: lat:"+latLng.latitude+","+latLng.longitude);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,zoom));
}
public void initMap(){
SupportMapFragment mapFragment=(SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
if (mapFragment!=null){
mapFragment.getMapAsync(callback);
}
}
private void getLocatonPermission() {
String[] permissions={Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION
} ;
if (ContextCompat.checkSelfPermission(getContext(),FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(getContext(),COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
initMap();
} else {
ActivityCompat.requestPermissions(getActivity(),permissions,LOCATION_PERMISSION_CODE);
}
} else {
ActivityCompat.requestPermissions(getActivity(),LOCATION_PERMISSION_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
mLocationPermissionGranted=false;
switch (requestCode){
case LOCATION_PERMISSION_CODE:{
if (grantResults.length>0){
for (int i=0;i<grantResults.length;++i){
if (grantResults[i]!=PackageManager.PERMISSION_GRANTED){
mLocationPermissionGranted=false;
return;
}
}
mLocationPermissionGranted=true;
initMap();
}
}
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
}
}
XML代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<fragment
android:id="@+id/map"
class="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
解决方法
我认为您错过了检查位置提供程序是否已启用的功能:例如GPS:因此,您首先必须检查当前位置提供程序,并且如果该提供程序被禁用,请请求客户允许启用它。这是科特林代码,但我认为您可以弄清楚
function looper(){
If (condition) do something
else // loop again
}
looper();