The problem with the program is that it closes the Activity when it displays the Permission Alert.
If it should display the desired alert in the program in this way
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.
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.