Android位置权限错误,为空

时间:2019-03-20 10:03:10

标签: java android google-maps android-permissions

我是一名正在学习的学生,并尝试使用Google Map API。现在,我在长时间获取位置方面遇到了问题。昨天,我可以很好地使用它,但是突然之间,今天我不能使用它了。该代码有点长,因为我想表明该应用程序在使用该应用程序之前要求获得允许打开该位置的权限,但我认为我没有正确获得它。我认为该应用的启动方式不像我希望的那样。

从先前的活动意图到此MapsActivity的过程应该是提示您请求打开位置的权限,并且在打开位置后,Google地图标记将更新为当前位置。

现在,这些应用程序一直崩溃。

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    FusedLocationProviderClient mFusedLocationClient;
    LocationRequest mLocationRequest;
    LocationCallback mLocationCallback;
    double mLocationLat, mLocationLong;

    LocationSettingsRequest.Builder mLocationSettingsBuilder;
    SettingsClient client;
    Task<LocationSettingsResponse> task;
    private static final int REQUEST_CHECK_SETTINGS = 0x1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        setSupportActionBar(toolbar);
        //toolbar.setTitle("AskForMech : Maps");
        //toolbar.setLogo(R.drawable.ic_launcher);

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(MapsActivity.this);

        mLocationCallback = new LocationCallback(){
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if(locationResult==null){
                    return;
                } else {
                    mLocationLat = locationResult.getLastLocation().getLatitude();
                    mLocationLong = locationResult.getLastLocation().getLongitude();
                }
            }
        };

        setLocationRequestSettings();

    }

    public void getLocation(){ //error is here
        LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        mLocationLat = location.getLatitude();
        mLocationLong = location.getLongitude();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        getLocation(); //error is here
        LatLng pos = new LatLng(mLocationLat, mLocationLong);
        mMap.addMarker(new MarkerOptions().position(pos).title("You!"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(pos));
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(pos, 18.00f));
    }

    @Override
    protected void onResume() {
        super.onResume();
        //startLocationUpdate();
         requestLocationUpdate();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if(mFusedLocationClient != null){

            mFusedLocationClient.removeLocationUpdates(mLocationCallback);
            Toast.makeText(MapsActivity.this, "Listener is removed.", Toast.LENGTH_SHORT).show();
        }
    }

    private void requestLocationUpdate(){
        mLocationSettingsBuilder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);
        client = LocationServices.getSettingsClient(MapsActivity.this);

        task = client.checkLocationSettings(mLocationSettingsBuilder.build());

        task.addOnSuccessListener(MapsActivity.this, new OnSuccessListener<LocationSettingsResponse>() {
            @Override
            public void onSuccess(LocationSettingsResponse locationSettingsResponse) {

                startLocationUpdate();
            }
        });

        task.addOnFailureListener(MapsActivity.this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

                if(e instanceof ResolvableApiException){
                    try{

                        ResolvableApiException resolvable = (ResolvableApiException) e;
                        resolvable.startResolutionForResult(MapsActivity.this, REQUEST_CHECK_SETTINGS);

                    }catch(IntentSender.SendIntentException sendEx) {

                    }
                }
            }
        });
    }

    private void setLocationRequestSettings(){

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setInterval(3000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    private void startLocationUpdate(){
            // Here, thisActivity is the current activity
            if (ContextCompat.checkSelfPermission(MapsActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {

                if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this,
                        Manifest.permission.ACCESS_FINE_LOCATION)) {

                    showExplanation();

                } else {
                    ActivityCompat.requestPermissions(MapsActivity.this,
                            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                            0);

                }
            } else {

                mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
                Toast.makeText(MapsActivity.this, "Location permission was granted!", Toast.LENGTH_SHORT).show();
            }
        }

    private void showExplanation(){
        AlertDialog.Builder builder = new AlertDialog.Builder(MapsActivity.this);

        builder.setTitle("Requires Location Permission.");
        builder.setMessage("This app needs location permission to get the location information.");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                ActivityCompat.requestPermissions(MapsActivity.this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        0);
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MapsActivity.this, "Sorry, this function cannot be used until permission is granted.",Toast.LENGTH_SHORT).show();
            }
        });
        builder.show();
    }
}

1 个答案:

答案 0 :(得分:1)

您应该使用回调方法onLocationChanged()而不是getLastKnownLocation ()。实际上,getLastKnownLocation()可以返回null(请参阅here

我更喜欢使用onLocationChanged(),一旦检测到位置变化,就会调用它。事实证明,它对我很有用。

如果您在实现LocationListener时遇到任何麻烦,请看一下这篇文章:https://stackoverflow.com/a/42218626/3780625

最佳