Разрешение времени выполнения из приложения - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу попросить разрешения у класса приложения. Как я могу запросить разрешение на доступ к идентификатору устройства? Я не могу запросить разрешение у действия, так как оно вылетает перед запуском экрана активности spla sh. Следующий код является частью экранной активности spla sh.

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    checkpermi();

Код для проверки разрешения

public  void checkpermi() {    
if(ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
            + ContextCompat.checkSelfPermission(
            this,Manifest.permission.READ_PHONE_STATE)
            + ContextCompat.checkSelfPermission(
            this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){

        // Do something, when permissions not granted
        if(ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.ACCESS_FINE_LOCATION)
                || ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.READ_PHONE_STATE)
                || ActivityCompat.shouldShowRequestPermissionRationale(
                this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            // If we should give explanation of requested permissions

            // Show an alert dialog here with request explanation
            AlertDialog.Builder builder = new AlertDialog.Builder(SplashScreenActivity.this);
            builder.setMessage("Location, Read Contacts and Write External" +
                    " Storage permissions are required to do the task.");
            builder.setTitle("Please grant those permissions");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ActivityCompat.requestPermissions(
                            SplashScreenActivity.this,
                            new String[]{
                                    Manifest.permission.ACCESS_FINE_LOCATION,
                                    Manifest.permission.READ_PHONE_STATE,
                                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                            },

                            STORAGE_PERMISSION_CODE
                    );
                }
            });
            builder.setNeutralButton("Cancel",null);
            AlertDialog dialog = builder.create();
            dialog.show();
        }else{
            // Directly request for required permissions, without explanation
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{
                            Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.READ_PHONE_STATE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                    },
                    STORAGE_PERMISSION_CODE
            );
        }
    }else {
        // Do something, when permissions are already granted
        Toast.makeText(SplashScreenActivity.this,"Permissions already granted",Toast.LENGTH_SHORT).show();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    //Checking the request code of our request
    if(requestCode == STORAGE_PERMISSION_CODE){

        //If permission is granted
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

            //Displaying a toast
            Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
        }else{
            //Displaying another toast if permission is not granted
            Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
        }
    }
}

Но вместо открытия экранной активности spla sh при создании Метод переопределяет метод on класса приложения Collect. java. Коды:

@Override
public void onCreate() {
    singleton = this;

    super.onCreate();

    PropertyManager mgr = new PropertyManager(this);


    mActivityLogger = new ActivityLogger(

            mgr.getSingularProperty(PropertyManager.DEVICE_ID_PROPERTY));
}

Если я не могу удалить приведенный выше код, так как большинство кнопок внутри приложения не будут работать.

И журналы ошибок:

2020-02-27 16: 36: 12.159 31359-31359 / com.gi c .spade. android E / AndroidRuntime : FATAL EXCEPTION: main Процесс: com.gi c .spade. android, PID: 31359 java .lang.RuntimeException: Невозможно создать приложение com.gi c .spade. android .application. Собрать: java .lang.SecurityException: getDeviceId: Ни пользователь 10366, ни текущий процесс не имеют android .permission.READ_PHONE_STATE. в android .app.ActivityThread.handleBindApplication (ActivityThread. java: 6065) в android .app.ActivityThread.-wrap1 (Неизвестный источник: 0) в android .app.ActivityThread $ H.handleMessage (ActivityThread . java: 1764) в android .os.Handler.dispatchMessage (Обработчик. java: 105) в android .os.Looper.l oop (Looper. java: 164) в android .app.ActivityThread.main (ActivityThread. java: 6944) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.Zygote $ MethodAndArgsCaller.run ( Zygote. java: 327) в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 1374) Причина: java .lang.SecurityException: getDeviceId: Ни пользователь 10366, ни текущий процесс имеет android .permission.READ_PHONE_STATE. в android .os.Parcel.readException (Parcel. java: 1959) в android .os.Parcel.readException (Parcel. java: 1905) в com. android .internal.telephony.ITelephony $ Stub $ Proxy.getDeviceId (ITelephony. java: 5333) на android .telephony.TelephonyManager.getDeviceId (TelephonyManager. java: 1069) на com.gi c .spade. android .logi c .PropertyManager. (PropertyManager. java: 135) в com.gi c .spade. android .application.Collect.onCreate (Collect. java: 260) в android .app.Instrumentation .callApplicationOnCreate (Instrumentation. java: 1125) в android .app.ActivityThread.handleBindApplication (ActivityThread. java: 6062) в android .app.ActivityThread.-wrap1 (Неизвестный источник: 0) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1764) в android .os.Handler.dispatchMessage (Обработчик. java: 105) в android .os.Looper.l oop (Looper. java: 164) на android .app.ActivityThread.main (ActivityThread. java: 6944) на java .lang.reflect.Method.invoke (собственный метод) на com. android .internal.os.Zygote $ MethodAndArgsCaller .run (Zygote. java: 327) по тел. android .internal.os.ZygoteInit.main (ZygoteInit. java: 1374)

1 Ответ

0 голосов
/ 27 февраля 2020

Если вам нужно разрешение, прежде чем вы могли бы даже запросить разрешение, возможно, вам следует заключить, что ваш код плохо спроектирован.

Просто обходите этот код, пока не сможете перезапустить его, когда будут предоставлены разрешения.

В вашем вопросе вы, кажется, хотите отправить идентификатор устройства при создании приложения. Только не отправляйте его, если у вас нет разрешения на его получение.

if (checkPermission(...) == GRANTED) {
    PropertyManager mgr = new PropertyManager(this);
    mActivityLogger = new ActivityLogger(mgr.getSingularProperty(PropertyManager.DEVICE_ID_PROPERTY));
} else {
    mActivityLogger = new ActivityLogger();
    // Or even disable that logger altogether
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...