I have all the premissions defined in my manifest for using gps. Like
"uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
"uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Everytime I try to open this activity on Android 6.0 it stops with this logcat message. But works on some phones. Can someone help me figure out, and provide a solution. I have been stuck in days trying to figure this out,and how to solve it.
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.data.smurf/org.data.smurf.Konkurranse}: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:688)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:908)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:469)
at org.data.smurf.Konkurranse.onCreate(Konkurranse.java:197)
at android.app.Activity.performCreate(Activity.java:6876)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Here is my Konkurranse/Competition activity. I have removed code not related like menu , and actionbar.
Public class Konkurranse Extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
Fresco.initialize(getApplicationContext());
setContentView(R.layout.activity_konkurranse);
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
final com.facebook.Profile profile = com.facebook.Profile.getCurrentProfile();
final ProfilePictureView profilePictureView = (ProfilePictureView) findViewById(R.id.profilepic);
final TextView name = (TextView) findViewById(R.id.name);
simpleDraweeView = (SimpleDraweeView) findViewById(R.id.profilePicture);
RoundingParams roundingParams = RoundingParams.fromCornersRadius(50f);
roundingParams.setRoundAsCircle(true);
simpleDraweeView.getHierarchy().setRoundingParams(roundingParams);
/// Logged IN \\\
if (profile != null) {
profilePictureView.getProfileId();
profilePictureView.setProfileId(profile.getId());
name.setText(profile.getName());
simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100));
}
final SharedPreferences sharedPrefs = getSharedPreferences("details", MODE_PRIVATE);
//After referencing your Views, add this.
final String nameStr = sharedPrefs.getString("name", null);
final String idStr = sharedPrefs.getString("id", null);
AccessToken token = AccessToken.getCurrentAccessToken();
if (token != null) {
if (nameStr != null) name.setText(nameStr);
if (idStr != null) profilePictureView.setProfileId(idStr);
simpleDraweeView.setImageURI(profile.getProfilePictureUri(100, 100));
}
//.. Do the same for other profile data
mobilnummer = (EditText) findViewById(R.id.mobilnummer);
buttongps = (Button) findViewById(R.id.gps);
buttongps.setOnClickListener(onButtongpsClick);
buttonblue = (Button) findViewById(R.id.bluetooth);
buttonblue.setOnClickListener(onButtonblueClick);
final LocationManager manager;
manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
final ImageView gpsImg = (ImageView) findViewById(R.id.gpsstatus);
if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
gpsImg.setImageResource(R.drawable.ok);
} else {
gpsImg.setImageResource(R.drawable.notok); //not ok
}
// Register bluettoth listener
bluetoothListener = new BluetoothListener() {
@Override
public void onBluetoothOff() {
btImg.setImageResource(R.drawable.notok); //not ok
}
@Override
public void onBluetoothOn() {
btImg.setImageResource(R.drawable.ok);
}
};
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(bluetoothListener, filter);
gpsListener = new GPSListener(this) {
@Override
public void onGPSOff() {
gpsImg.setImageResource(R.drawable.notok); //not ok
}
@Override
public void onGPSOn() {
gpsImg.setImageResource(R.drawable.ok);
}
};
// Henter fra SharedPrefs
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
String savedMobileNumber = prefs.getString("mobilnummer", "");
mobilnummer.setText(savedMobileNumber);
final ImageView tlfstatus = (ImageView) findViewById(R.id.tlfstatus);
if (mobilnummer.getText().toString().length() >= 8) {
tlfstatus.setImageResource(R.drawable.ok);
} else {
tlfstatus.setImageResource(R.drawable.notok); //not ok
}
// OnCreate ends here.
}
public View.OnClickListener onButtongpsClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent gpsOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(gpsOptionsIntent);
}
};
public View.OnClickListener onButtonblueClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
BluetoothAdapter mBluetoothAdapter;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (!mBluetoothAdapter.isEnabled()) mBluetoothAdapter.enable();
ImageView img = (ImageView) findViewById(R.id.bluestatus);
img.setImageResource(R.drawable.ok);
}
};
}
Serg's answer is true. With Marshmallow(Android 6.0, API Level 23) permissiom system has changed and now you need to take care of Marshmallow devices by requesting permissions at runtime. There are some libraries to make the process easier.
Easy Permissions is one of them.