Android 6.0.1在运行时获得权限后未获取位置

时间:2017-09-20 10:35:21

标签: android google-maps android-studio google-maps-api-3 fusedlocationproviderapi

我正在使用Google地图和使用Fused Location API获取位置。每件事都按预期工作正常。我有一个版本6.0的设备

我的代码运行良好。但是现在在软件更新后我认为它现在是6.0.1,我的代码不能正常工作,但它的工作在6.0以下。我的问题如下:

问题:
             我在运行时检查权限,用户必须允许位置。拒绝我只是放弃了活动,因为我认为在我的应用业务逻辑中需要位置。但是,当用户允许位置时,我甚至没有获得位置。这是我要求许可的方式

//Initialize Google Play Services
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            //Location Permission already granted
            buildGoogleApiClient();
            mGoogleMap.setMyLocationEnabled(true);
        } else {
            //Request Location Permission
            checkLocationPermission();
        }
    } else {
        buildGoogleApiClient();
        mGoogleMap.setMyLocationEnabled(true);
    }


private void checkLocationPermission() {
    if (!isPlayServicesAvailable(this))
        return;
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
            new AlertDialog.Builder(this)
                    .setTitle("Location Permission Needed")
                    .setMessage("This app needs the Location permission, please accept to use location functionality")
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //Prompt the user once explanation has been shown
                            ActivityCompat.requestPermissions(GoogleMapsActivity.this,
                                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        }
                    })
                    .create()
                    .show();


        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
    }
}
  

在这里,我正在听取请求批准

     @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, yay! Do the
                    // location-related task you need to do.
                    if (ContextCompat.checkSelfPermission(GoogleMapsActivity.this,
                            Manifest.permission.ACCESS_FINE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {

                        if (mGoogleApiClient == null) {
                            buildGoogleApiClient();
                        }
                        mGoogleMap.setMyLocationEnabled(true);
                    }
                    startLocationUpdates();

                } else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
//                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                       mRequestingLocationUpdates = false;
                       Toast.makeText(GoogleMapsActivity.this, "To enable the function of this application please enable position information permission of the application from the setting screen of the terminal.", Toast.LENGTH_SHORT).show();
                    } else {
                       showRationaleDialog();
                    }
                }
                return;
            }

        }
    }
  

这是我的StartLocationUpdate方法

   private void startLocationUpdates() {
        try {

            if (mGoogleMap != null)
                mGoogleMap.setMyLocationEnabled(true);

            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(mLocationRequest);
            //Check whether setting of position information is valid before acquiring current position
            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                    final Status status = locationSettingsResult.getStatus();

                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.SUCCESS:

                            // Since the setting is valid, the current position is acquired
//                            if (ContextCompat.checkSelfPermission(GoogleMapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//                                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, GoogleMapsActivity.this);
//                            }

                            // check if the device has OS Marshmellow or greater than
                            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
                                if (GoogleMapsActivity.this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && GoogleMapsActivity.this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                                    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                                } else {
                                    // get Location
                                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, GoogleMapsActivity.this);
                                }
                            } else {
                                // get Location
                                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, GoogleMapsActivity.this);
                            }


                            break;
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Since the setting is not valid, a dialog is displayed
                            try {
                                status.startResolutionForResult(GoogleMapsActivity.this, REQUEST_CHECK_SETTINGS);
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            }
                            break;
                        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                            // Location settings are not satisfied. However, we have no way
                            // to fix the settings so we won't show the dialog.
                            break;
                    }
                }
            });
        } catch (Exception e) {
            Log.e("Exception", " Exception while Starting Location >>> " + e.toString());
        }
    }


     protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

我不明白是什么问题。但我解决的是以下内容:

  1. 在我的设备上有marshmellow(我在更新设备之前不知道它是6.0.0还是6.0.1)我的代码是workin,当用户允许位置权限时,我得到我的位置,我的代码在所需的地方绘制图钉。
  2. 现在它不起作用,我不知道为什么。要么是因为更新我的手机,要么我也更新了SDK。更新任何这些可能会在我的方案中生效?
  3.   

    我只是想知道在User Allow location服务之后是否有任何人遇到了无法接收位置更新的问题。请帮忙。

0 个答案:

没有答案