androidgpsandroid-6.0-marshmallowandroid-6.0.1-marshmallow

Android 6.0 "gps" location provider requires ACCESS_FINE_LOCATION permission


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

Solution

  • 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.