permissions - Android “gps requires ACCESS_FINE_LOCATION” error -


i using sdk-23, , every time run application, securityexception gets thrown , error debugger reads so:

java.lang.securityexception: "gps" location provider requires access_coarse_location or access_fine_location permission.

this seems simple mistake, however, manifest file correct. here is, , here mapactivity code 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 menu; adds items action bar if present.     getmenuinflater().inflate(r.menu.menu_main, menu);     return true; }  @override public boolean onoptionsitemselected(menuitem item) {     // handle action bar item clicks here. action bar     // automatically handle clicks on home/up button, long     // specify 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 created or not         if (googlemap == null) {             toast.maketext(getapplicationcontext(),                     "sorry! unable 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);     }  }  } 

if targeting android m, need ask users permission access device gps. here not clean code, might u little bit. better way create own permission manager class handle requests , alertdialog ativity.

whats happening below is

1) checking if permissions granted. 2) if not, checking if permissions have been denied previously, in case, showing rationale, explain user why need permissions. 3) show request permission popup using activitycompat. 4) if user declines, show snackbar view button take user app info screen, whenever u need access gps notice permissions 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 {             // request 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 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 gps permission         }     });      mcancelbutton.setonclicklistener(new view.onclicklistener() {          @override         public void onclick(view v) {             storagerationalealert.dismiss();             //show permission snackbar         }     });      storagerationalealert.show(); } 

Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -