Search code examples
androidandroid-activitypermissionsalert

Problem when showing alert requestPermissions close Activity


The problem with the program is that it closes the Activity when it displays the Permission Alert.

Like this photo enter image description here

If it should display the desired alert in the program in this way enter image description here

Build.gradle

android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.sgpco.mygiti"
    minSdkVersion 16
    targetSdkVersion 28
    versionCode 1
    versionName "1.2.9.9"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    vectorDrawables.useSupportLibrary = true
}
signingConfigs {
    config {
        keyAlias '****'
        keyPassword '****'
        storeFile file('*****')
        storePassword '****'
    }
}
buildTypes {
    release {
        
    }
    debug {
        clean
        multiDexEnabled true
    }
}
lintOptions {
    checkReleaseBuilds false
    abortOnError false
}
}

Style

<resources>

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    <item name="android:windowLightStatusBar">false</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

<style name="AppThemeBlack" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/Black</item>
    <item name="colorPrimaryDark">@color/Gray</item>
    <item name="colorAccent">@color/White</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    <item name="android:windowLightStatusBar">false</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" >
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimary</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

<style name="WindowAnimationTransition" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

<style name="CustomProgressBar" parent="android:Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:progressDrawable">@xml/layout_progress</item>
    <item name="android:minHeight">20dp</item>
    <item name="android:maxHeight">20dp</item>
</style>

Manifests

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:name=".Application.Utility.AppController"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:networkSecurityConfig="@xml/network_security_config"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:theme="@style/AppTheme">

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.authorityStr"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

    <activity
        android:name=".Application.Activities.ActAgent.ActLogin"
        android:launchMode="singleTask"
        android:screenOrientation="unspecified"
        android:theme="@style/AppTheme"
        android:windowSoftInputMode="stateAlwaysVisible">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
   </application>

Activity

public class BaseActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 200;
private static final String[] REQUIRED_SDK_PERMISSIONS = new String[] {
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE
};

@Override
protected void onResume() {
    super.onResume();
    if (Build.VERSION.SDK_INT >= 23) {
        final List<String> missingPermissions = new ArrayList<String>();
        // check all required dynamic permissions
        for (final String permission : REQUIRED_SDK_PERMISSIONS) {
            final int result = ContextCompat.checkSelfPermission(this, permission);
            if (result != PackageManager.PERMISSION_GRANTED) {
                missingPermissions.add(permission);
            }
        }
        if (!missingPermissions.isEmpty()) {
            // request all missing permissions
            final String[] permissions = missingPermissions
                    .toArray(new String[missingPermissions.size()]);
            requestPermissions(permissions, PERMISSION_REQUEST_CODE);
        } else {
            final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
            Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
            onRequestPermissionsResult(PERMISSION_REQUEST_CODE, REQUIRED_SDK_PERMISSIONS,
                    grantResults);
        }
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (Build.VERSION.SDK_INT >= 23) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                for (int index = permissions.length - 1; index >= 0; --index) {
                if (grantResults[index] != PackageManager.PERMISSION_GRANTED) {
                    finish();
                    return;
                }
            }
                break;
        }
    }
}
}

The work I have done is according to the above method and My general problem is that it closes the Activity whenever it displays this Alert.


Solution

  • so this is some simulated code made to show your problem origin:

       Intent intent = new Intent(Splash_Activity.this, 
       Test_Activity.class);
       intent .addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
       intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
       startActivity(intent);
    

    As you see here when I am starting the Test_Activity which is the Activity I am requesting permission in it, I am adding some flags to the intent that is starting it so that when this activity is no longer visible it will be destroyed automatically, and it seems that requesting a permission does blocks the activity as if it is no longer visible so it is getting destroyed and then there is blackout behind the permission dialog because there is no activity alive anymore and then pressing deny or allow will simply dismiss the dialog and send a callback to the onRequestPermissionsResult method but the activity is not alive to receive the callback. so the flags added initially to the intent is the problem. so remove the flags which are added to the intent that is starting the activity where you are requesting permission.