Я хочу попросить разрешения у класса приложения. Как я могу запросить разрешение на доступ к идентификатору устройства? Я не могу запросить разрешение у действия, так как оно вылетает перед запуском экрана активности 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)