Приложение не запрашивает разрешения - PullRequest
0 голосов
/ 27 мая 2018

У меня есть этот код, чтобы получить следующие разрешения (READ_PHONE_STATE, READ_CONTACTS, WRITE_CONTACTS) :

int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS);
if (permissionCheck != PackageManager.PERMISSION_GRANTED && permissionCheck1 != PackageManager.PERMISSION_GRANTED && permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 1);
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 2);
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 3);

} else {
    TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    mPhoneNumber = tMgr.getLine1Number();
}

Я знаю, что у меня нет этих разрешенийпотому что я получаю сообщение об ошибке:

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{95e4cb4 30797:com.example.ortel.tagnet/u0a217} (pid=30797, uid=10217) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

Также: он не запрашивает у меня разрешения на доступ к READ_CONTACTS и WRITE_CONTACTS.

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Если у вас есть 10 разрешений, вы расширите свой код еще на 20 строк.Нееееет!

У вас есть 2 способа

  1. Следуйте правильному способу, чтобы получить разрешение.Я публикую свой фрагмент кода, скопируйте этот код в свой базовый класс активности.
  2. Или вы используете RxPermissions .Если вы новичок в Android.

Вот мой фрагмент кода.

String[] permissions = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS};

        getBulkPermissions(permissions, new RequestPermissionAction() {
            @Override
            public void permissionDenied() {
                // TODO: 5/27/2018 handle permission deny 
            }

            @Override
            public void permissionGranted() {
                // TODO: 5/27/2018 you code do further operations 
            }
        });

Может ли он быть проще?

Теперь вы положите этот код BaseКласс деятельности и использовать в любом месте, где вам нужно.Или введите ваш текущий класс, если вам это не нужно в любом другом месте.

RequestPermissionAction onPermissionCallBack;
private final static int REQUEST_BULK_PERMISSION = 3006;

private boolean checkBulkPermissions(String[] permissions) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        for (String permission : permissions) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    } else {
        return true;
    }
}

public void getBulkPermissions(String[] permissions, RequestPermissionAction onPermissionCallBack) {
    this.onPermissionCallBack = onPermissionCallBack;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!checkBulkPermissions(permissions)) {
            requestPermissions(permissions, REQUEST_BULK_PERMISSION);
            return;
        }
    }
    if (onPermissionCallBack != null)
        onPermissionCallBack.permissionGranted();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        if (onPermissionCallBack != null)
            onPermissionCallBack.permissionGranted();
    } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
        if (onPermissionCallBack != null)
            onPermissionCallBack.permissionDenied();
    }
}

public interface RequestPermissionAction {
    void permissionDenied();
    void permissionGranted();
}
0 голосов
/ 27 мая 2018

Вы используете && вместо ||.В существующем состоянии вы не будете запрашивать каких-либо разрешений во время выполнения, если у вас будет только одно из трех.

Кроме того, вы звоните requestPermissions() три раза.Позвоните один раз, с любыми разрешениями, которые вам нужны.new String[] создает массив строк, и он может содержать все три желаемых имени доступа.

...