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); } } }