Разрешения Android Splash Runtime не работают - PullRequest
0 голосов
/ 20 февраля 2019

Я использовал точно такой же код из репо:

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'

1 Ответ

0 голосов
/ 20 февраля 2019

Вы неправильно сделали разрешение во время выполнения.Ваш код не работает под управлением Android 6 и выше.Следуйте этому https://github.com/ArunaMahaGamage/Android-Runtime-Permission

Вы собираетесь опубликовать свое приложение в Play Store.Дважды проверьте разрешение звонка и смс.Если эти разрешения вам не нужны, удалите их из манифеста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...