Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android 6 Permissions => Crash when disable permission and go back to the app

I would like to use permission for android 6 in my app but i saw a strange event. Perhaps you can help me about that.

If you start your app with "Dangerous" permissions, these permissions appears in the "App permissions" of your android device. PERFECT!

BUT if you keep your app in background, go to the "App permissions" menu, disable (you can enable and then disable it) a permission and go back to your app, android never go to onStart (Fragment or activity) ?! And never go there again.

If you don't touch to the permission or if you enable a permission => it go to onStart and others.

That's problematic, for exemple, if your app use listeners, you can't restart it and you can have a crash...

Do you know the method where Android go when you disable a permission ?

I tried onCreate onStart onResume onRestart onRestoreInstanceState onActionModeStarted onRestoreInstanceState onPostResume onContentChanged

... but no way... :/

like image 677
acs-team Avatar asked Oct 07 '15 12:10

acs-team


1 Answers

Here is my solution:

I use some fragments in my mainActivity.

As you know, the activity is recreated when user disable a permission => go through onCreate, ...

What i do in the onCreate(...) of my mainActivity, i remove all loaded fragments and put my app in the same state as a first run.

Like this:

    // Clean fragments (only if the app is recreated (When user disable permission))
    FragmentManager fragmentManager = getSupportFragmentManager();
    if (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

    // Remove previous fragments (case of the app was restarted after changed permission on android 6 and higher)
    List<Fragment> fragmentList = fragmentManager.getFragments();
    if (fragmentList != null) {
        for (Fragment fragment : fragmentList) {
            if (fragment != null) {
                fragmentManager.beginTransaction().remove(fragment).commit();
            }
        }
    }

Be careful !!! : I had a crash with the version 23.2.0 of appcompat and design libraries. This crash appear when the app is recreated !

Check this link for more info.

like image 193
acs-team Avatar answered Nov 15 '22 18:11

acs-team