Я использовал точно такой же код из репо:
https://github.com/pcess/tutorials/tree/master/SplashPermissions
Автономное приложение в репо работает совершенно нормально.Однако, когда тот же код реализован в моем приложении, разрешения зацикливаются, и приложение не предоставляет никаких разрешений.
Файл манифеста:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.******.dms_IN"
android:versionCode="6"
android:versionName="5.7.0">
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.******.dms_IN"
android:versionCode="6"
android:versionName="5.7.0">
<application
android:name="com.******.screen.MyApp"
android:allowBackup="false"
android:icon="@mipmap/icon_new"
android:label="@string/ApplicationName"
android:largeHeap="true"
android:theme="@style/MyCustomTheme">
<activity
android:name="com.******.screen.SplashPermissionsActivity"
android:label="@string/ApplicationName">
</activity>
<activity android:name="com.******.screen.FirstTimePermission"
android:label="@string/ApplicationName"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.******.screen.StartActivity"
android:label="@string/ApplicationName"
android:screenOrientation="portrait">
</activity>
<activity
android:name="com.******.screen.ColgateDMSWelcome"
android:label="@string/ApplicationName"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.Setup"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.MyGridView"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" />
<activity
android:name="com.******.screen.ProdOrderBooking"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan" />
<activity
android:name="com.******.screen.OrderBookingSummary"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.OrderBookingView"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.OrderSummary"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.OrderBookingKPI"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.SKUWiseSummary"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name="com.******.screen.BTWrapperActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme" />
<activity
android:name="com.******.screen.CallSheetSummary"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.MSSStore"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.******.screen.SalesmanKPI"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.Salesman_KPI_Re"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
<activity
android:name="com.******.screen.CustomerSummary"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.SchemeList"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.CashCollection"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.RouteList"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog" />
<activity
android:name="com.******.screen.ListAsDialog"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog" />
<activity
android:name="com.******.map.Map"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog" />
<activity
android:name="com.******.screen.NotificationView"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Dialog" />
<activity
android:name="com.******.signature.CaptureSignature"
android:screenOrientation="portrait" />
<activity
android:name="com.******.screen.ImageViewer"
android:screenOrientation="portrait" /> <!-- [START firebase_service] -->
<service android:name="com.******.PushNotify.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service> <!-- [END firebase_service] -->
<!-- [START firebase_iid_service] -->
<service
android:name="com.******.PushNotify.MyFirebaseInstanceIDService"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<activity android:name="com.******.screen.CreateCustomer" />
</application>
</manifest>
Код:
Деятельность FirstTimePermission:
<code>import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;
public class FirstTimePermission extends Activity {
/*
* ---------------------------------------------
*
* Private Fields
*
* ---------------------------------------------
*/
/**
* The time that the splash screen will be on the screen in milliseconds.
*/
private int timeoutMillis = 5000;
/** The time when this {@link Activity} was created. */
private long startTimeMillis = 0;
/** The code used when requesting permissions */
private static final int PERMISSIONS_REQUEST = 1234;
/** A random number generator for the background colors. */
private static final Random random = new Random();
/**
* The TextView which is used to inform the user whether the permissions are
* granted.
*/
private TextView textView = null;
private static final int textViewID = View.generateViewId();
/*
* ---------------------------------------------
*
* Getters
*
* ---------------------------------------------
*/
/**
* Get the time (in milliseconds) that the splash screen will be on the
* screen before starting the {@link Activity} who's class is returned by
* {@link #getNextActivityClass()}.
*/
public int getTimeoutMillis() {
return timeoutMillis;
}
/** Get the {@link Activity} to start when the splash screen times out. */
@SuppressWarnings("rawtypes")
public Class getNextActivityClass() {
return StartActivity.class;
}
/**
* Get the list of required permissions by searching the manifest. If you
* don't think the default behavior is working, then you could try
* overriding this function to return something like:
*
* <pre>
* <code>
* return new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
* </code>
*
* / public String [] getRequiredPermissions () {String [] permissions = null;try {permissions = getPackageManager (). getPackageInfo (getPackageName (), PackageManager.GET_PERMISSIONS) .requestedPermissions;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace ();} if (permissions == null) {return new String [0];} else {return permissions.clone ();}} / * * ---------------------------------------------* * Методы деятельности * * --------------------------------------------- * / @TargetApi (23) @Override protected void onCreate (Bundle saveInstanceState) {/ ** Код создания по умолчанию.* / super.onCreate (saveInstanceState);/ ** Создать макет, который будет содержать TextView.* / LinearLayout mainLayout = новый LinearLayout (this);mainLayout.setLayoutParams (new LinearLayout.LayoutParams (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));/ ** Добавить TextView и установить исходный текст.* / textView = новый TextView (это);textView.setTextSize (50);textView.setId (textViewID);textView.setText («Ожидание разрешений ...»);mainLayout.addView (textView, new LinearLayout.LayoutParams (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));/ ** Установить цвет фона.* / int off = 128;int rest = 256 - выкл;int color = Color.argb (255, off + random.nextInt (rest), off + random.nextInt (rest), off + random.nextInt (rest));mainLayout.setBackgroundColor (цвет);/ ** Установить mainLayout в качестве представления содержимого * / setContentView (mainLayout);/ ** * Сохраните время начала этого занятия, которое будет использоваться * для определения времени ожидания заставки.* / startTimeMillis = System.currentTimeMillis ();/ ** * На устройствах после Android 6.0 проверьте, были ли предоставлены необходимые разрешения *.* / if (Build.VERSION.SDK_INT> = 23) {checkPermissions ();} else {startNextActivity ();}} / ** * Посмотрим, есть ли у нас все необходимые опасные разрешения.В противном случае * сообщите пользователю, что он не может продолжить работу без предоставления разрешений *, а затем снова запросите разрешения.* / @TargetApi (23) @Override public void onRequestPermissionsResult (int requestCode, String permissions [], int [] grantResults) {if (requestCode == PERMISSIONS_REQUEST) {checkPermissions ();}} / * * ---------------------------------------------* * Другие методы * * --------------------------------------------- * / / ** * По истечении времени ожидания запустите {@link Activity}, как указано * {@link #getNextActivityClass ()}, и удалите заставку из * backstack.Кроме того, мы можем изменить сообщение, отображаемое пользователю, чтобы сообщить им * у нас теперь есть необходимые разрешения.* / private void startNextActivity () {runOnUiThread (() -> textView.setText ("Предоставленные разрешения ..."));long delayMillis = getTimeoutMillis () - (System.currentTimeMillis () - startTimeMillis);if (delayMillis <0) {delayMillis = 0;} new Handler (). postDelayed (() -> {startActivity (new Intent (FirstTimePermission.this, getNextActivityClass ())); finish ();}, delayMillis);} / ** * Проверьте, были ли предоставлены необходимые разрешения, и * {@link #startNextActivity ()}, если они были предоставлены.В противном случае * {@link #requestPermissions (String [], int)}.* / private void checkPermissions () {String [] ungrantedPermissions = requiredPermissionsStillNeeded ();if (ungrantedPermissions.length == 0) {startNextActivity ();} else {requestPermissions (ungrantedPermissions, PERMISSIONS_REQUEST);}} / ** * Преобразование массива необходимых разрешений в {@link Set} для удаления * лишних элементов.Затем удалите уже предоставленные разрешения и верните * массив незарегистрированных разрешений.* / @TargetApi (23) private String [] requiredPermissionsStillNeeded () {Set permissions = new HashSet ();for (разрешение строки: getRequiredPermissions ()) {permissions.add (разрешение);} for (Итератор i = permissions.iterator (); i.hasNext ();) {String разрешению = i.next ();if (checkSelfPermission (разрешение) == PackageManager.PERMISSION_GRANTED) {Log.d (SplashPermissionsActivity.class.getSimpleName (), "Permission:" + разрешение + "уже предоставлено.");i.remove ();} else {Log.d (SplashPermissionsActivity.class.getSimpleName (), "Разрешение:" + разрешение + "еще не предоставлено.");}} return permissions.toArray (new String [permissions.size ()]);}
Gradle (приложение):
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.******.dms_IN"
minSdkVersion 24
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
implementation files('libs/BixolonPrinter.jar')
implementation files('libs/commons-codec.jar')
implementation files('libs/mpandroidchartlibrary-2-1-3.jar')
implementation files('libs/sc-light-jdk15on-1.47.0.2.jar')
implementation files('libs/android-sm_https_v2_IN.jar')
implementation 'androidx.legacy:legacy-support-v4:1.0.0-beta01'
implementation 'com.google.code.gson:gson:2.8.0'
implementation 'com.google.guava:guava:18.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
implementation 'me.leolin:ShortcutBadger:1.1.16@aar'
implementation 'net.zetetic:android-database-sqlcipher:3.5.9@aar'
implementation('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
transitive = true
}
implementation 'com.google.firebase:firebase-config:11.8.0'
implementation 'com.google.firebase:firebase-core:11.8.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
}
apply plugin: 'com.google.gms.google-services'