Android “gps requires ACCESS_FINE_LOCATION” error

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

I am using SDK-23, and every time I run the application, my SecurityException gets thrown and the error from the debugger reads as so:

java.lang.SecurityException: "gps" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.

This seems like a simple mistake, however, my manifest file is completely correct. Here it is, and here is my MapActivity code as well:

package com.buahbatu.salesmonitoring;    public class MainActivity extends AppCompatActivity implements View.OnClickListener { final static String TAG = "MainActivity"; SwitchCompat switchTracked; MyService service; private GoogleMap googleMap; Context mContext; private TextView textAddress;   /* Google Fused Location Service */ public static GoogleApiClient mGoogleApiClient; public static LocationRequest mLocationRequest; public static GoogleApiClient.ConnectionCallbacks connectionCallbacks; public static GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener; public final static int REQUEST_LOCATION = 199; public final static int REQUEST_CONNECTION = 11; public final static int NOTIFICATION_ID = 2;  private static final String[] INITIAL_PERMS={         Manifest.permission.ACCESS_FINE_LOCATION,         Manifest.permission.READ_CONTACTS }; private static final String[] LOCATION_PERMS={         Manifest.permission.ACCESS_FINE_LOCATION };   boolean checkPermission() {     String location_fine = "android.permission.ACCESS_FINE_LOCATION";     String location_coarse = "android.permission.ACCESS_COARSE_LOCATION";     int permission_fine = mContext.checkCallingOrSelfPermission(location_fine);     int permission_coarse = mContext.checkCallingOrSelfPermission(location_coarse);     return permission_fine == PackageManager.PERMISSION_GRANTED && permission_coarse == PackageManager.PERMISSION_GRANTED; }   public void startTracking(Activity activity) {     if (checkPermission()) {         Log.i(TAG, "startTracking");         LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);     } else {         int permissionCheck = ContextCompat.checkSelfPermission(activity,                 Manifest.permission.ACCESS_FINE_LOCATION);     } }  @Override protected void onDestroy() {     super.onDestroy();     try {         service.setUpdateView(null);         initilizeMap();     } catch (Exception e) {         e.printStackTrace();     }  }  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     checkLoggedStatus();     setSupportActionBar((Toolbar) findViewById(R.id.top_toolbar));     ((TextView) findViewById(R.id.username_text)).setText(AppConfig.getUserName(this));     switchTracked = (SwitchCompat) findViewById(R.id.tracked_switch);     switchTracked.setOnCheckedChangeListener(onCheckedChangeListener);     switchTracked.setChecked(AppConfig.getOnTracked(this));     findViewById(R.id.test_but).setOnClickListener(this);     textAddress = (TextView) findViewById(R.id.txtAddress); }  CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {     @Override     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {         if (!isChecked) {             switchTracked.setText(R.string.untracked);             service.stopTracking();             AppConfig.saveOnTracked(MainActivity.this, false);         } else {             switchTracked.setText(R.string.tracked);             service = AcaciaX.createService(getApplicationContext(), MyService.class);             service.startTracking(MainActivity.this);             service.setUpdateView((TextView) findViewById(R.id.location_text));             AppConfig.saveOnTracked(MainActivity.this, true);         }     } };  void checkLoggedStatus() {     if (!AppConfig.getLoginStatus(this)) {         moveToLogin();     } }  void moveToLogin() {     Intent move = new Intent(this, LoginActivity.class);     startActivity(move);     finish(); }  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {     super.onActivityResult(requestCode, resultCode, data);     Log.d(TAG, Integer.toString(resultCode));      //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);     switch (requestCode) {         case ServiceImpl.REQUEST_CONNECTION:             switch (resultCode) {                 case Activity.RESULT_OK: {                      switchTracked.setChecked(true);                     break;                 }                 case Activity.RESULT_CANCELED: {                      Toast.makeText(this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();                     break;                 }                 default: {                     break;                 }             }             break;     } }  @Override public boolean onCreateOptionsMenu(Menu menu) {     // Inflate the menu; this adds items to the action bar if it is present.     getMenuInflater().inflate(R.menu.menu_main, menu);     return true; }  @Override public boolean onOptionsItemSelected(MenuItem item) {     // Handle action bar item clicks here. The action bar will     // automatically handle clicks on the Home/Up button, so long     // as you specify a parent activity in AndroidManifest.xml.     int id = item.getItemId();      //noinspection SimplifiableIfStatement     if (id == R.id.action_logout) {         AppConfig.saveLoginStatus(this, false);         AppConfig.storeAccount(this, "", "");         switchTracked.setChecked(false);          moveToLogin();         return true;     }      return super.onOptionsItemSelected(item); }  @Override public void onClick(View v) {     NetHelper.login(MainActivity.this, "Tester", "pasu", new PostWebTask.HttpConnectionEvent() {         @Override         public void preEvent() {          }          @Override         public void postEvent(String... result) {          }     });  }  private void initilizeMap() {     if (googleMap == null) {         googleMap = ((MapFragment) getFragmentManager().findFragmentById(                 R.id.map)).getMap();         setUpMap();          // check if map is created successfully or not         if (googleMap == null) {             Toast.makeText(getApplicationContext(),                     "Sorry! unable to create maps", Toast.LENGTH_SHORT)                     .show();         }         if (googleMap != null) {             //setUpMap();         }     }  }  @Override protected void onResume() {     super.onResume();     initilizeMap();     //googleMap.setMyLocationEnabled(true);     setUpMap(); }  public void setUpMap() {     if(checkPermission()) {         googleMap.setMyLocationEnabled(true);         LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);         Criteria criteria = new Criteria();         String provider = locationManager.getBestProvider(criteria, true);         Location location = locationManager.getLastKnownLocation(provider);          CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));         CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);          googleMap.moveCamera(center);         googleMap.animateCamera(zoom);          Geocoder geocoder;         List<Address> addresses;         geocoder = new Geocoder(this, Locale.getDefault());          try {             addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);              if (addresses != null) {                 String address = addresses.get(0).getAddressLine(0);                 String city = addresses.get(0).getLocality();                 String state = addresses.get(0).getAdminArea();                 String country = addresses.get(0).getCountryName();                 String postalCode = addresses.get(0).getPostalCode();                 String knowName = addresses.get(0).getFeatureName();                  String addressfull = address + " " + city + " " + state + " " + country + " " + postalCode + " " + knowName;                  Intent intent = new Intent();                 intent.putExtra("addressfull", addressfull);                 textAddress.setText(addressfull);             }         } catch (IOException e) {             e.printStackTrace();         }     }else{         requestPermissions(INITIAL_PERMS, 2);     }  }  } 

回答1:

If you are targeting Android M, you need to ask users permission to access device GPS. Here is a not so clean code, but might help u a little bit. A better way to do it would be to create your own permission manager class to handle requests and a alertDialog ativity.

Whats happening below is

1) You are checking if permissions are granted. 2) If not, you are checking if the permissions have been denied previously, In that case, you are showing a rationale, to explain to the user why you need the permissions. 3) You show the request permission popup using ActivityCompat. 4) If user declines, show a snackbar with a view button to take the user to the app info screen, whenever u need to access the GPS but notice that permissions are not granted.

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {         if (ActivityCompat.shouldShowRequestPermissionRationale(this,                 Manifest.permission.ACCESS_COARSE_LOCATION)) {             showRationale();         } else {             // do request the permission             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 8);         }     }  @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {      super.onRequestPermissionsResult(requestCode, permissions, grantResults);      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ){                 //Start your code             } else {                 //Show snackbar             }     } }  private void showRationale(){     String strDeleteMessage = getResources().getString(R.string.rationale_message11) ;      final View dialogView = LayoutInflater.from(this.getActivity()).inflate(R.layout.dialog_fragment, null);      final AlertDialog storageRationaleAlert = new AlertDialog.Builder(this.getActivity()).create();     storageRationaleAlert.setView(dialogView, 0, 0, 0, 0);     storageRationaleAlert.setCanceledOnTouchOutside(false);     TextView mDialogTitle = (TextView) dialogView.findViewById(R.id.dialog_title);     TextView mDialogDetails = (TextView) dialogView.findViewById(R.id.dialog_details);     mDialogDetails.setVisibility(View.VISIBLE);     Button mCancelButton = (Button) dialogView.findViewById(R.id.cancel_btn);     Button mOkButton = (Button) dialogView.findViewById(R.id.ok_btn);     mOkButton.setText(getString(R.string.dialog_continue));      mDialogDetails.setText(Html.fromHtml(strDeleteMessage));      final Activity activity = this.getActivity();     mOkButton.setOnClickListener(new View.OnClickListener() {          @Override         public void onClick(View v) {             storageRationaleAlert.dismiss();              //Ask for GPS permission         }     });      mCancelButton.setOnClickListener(new View.OnClickListener() {          @Override         public void onClick(View v) {             storageRationaleAlert.dismiss();             //Show permission snackbar         }     });      storageRationaleAlert.show(); } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!