Разрешения времени выполнения не работают на реальном устройстве - PullRequest
0 голосов
/ 01 июня 2018

Я реализовал разрешения для определения местоположения RT в своем приложении и протестировал его на устройстве Nougat.Я проверил logcat, но похоже, что ContextCompat.checkSelfPermission() and ActivityCompat.requestPermission не выполняется, и впоследствии onRequestPermissionRationale никогда не вызывается, но в настройках устройства для приложения оно всегда отображается как предоставленное разрешение

Я пробовал войти, как показано ниже вкод:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_client_home);

    prefsHelper = new SharedPrefsHelper(this);
    initViews();
    setSupportActionBar(toolbar);

    Log.d(TAG, "BEFORE CHECK");
    checkPerms();

    setUpDrawer();
    prefsHelper.setLoggedOut(false);

    getVehicles();
    handlePlacesInput();

    rideContinueLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (validate() && Utils.isNetwork(ClientHomeActivity.this)) {
                Intent intent = new Intent(ClientHomeActivity.this, BookRideActivity.class);
                intent.putExtra("start_addr", startAddr);
                intent.putExtra("dest_addr", destAddr);
                startActivity(intent);
                clearInputs();
            } else {
                Snackbar.make(findViewById(android.R.id.content), "Enter Start and Drop Locations", Snackbar.LENGTH_LONG).show();
            }
        }
    });

}

private void checkPerms() {
    Log.d(TAG, "DO CHECK");
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        Log.d(TAG, "INSIDE CHECK");
        reqPerms();
    }
}

private void reqPerms() {
    Log.d(TAG, "ASKING");
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, AppConstants.LOC_PERMS_REQ_CODE);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case AppConstants.LOC_PERMS_REQ_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d(TAG, "GRANTED");
            } else {
                if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
                    Log.d(TAG, "Permission Rationale");
                } else {
                    reqPerms();
                }

            }
            break;
    }
}

Журнал останавливается на "DO CHECK" tag and other tags after that don't execute.Я пытаюсь построить приложение на основе местоположения.Может кто-нибудь сказать мне, почему это происходит таким образом, это ошибка на моем устройстве или в коде?Спасибо.

Ответы [ 5 ]

0 голосов
/ 01 июня 2018

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

Целевая версия
Пожалуйста, установите targetSdkVersion в вашей сборке больше 23

Объявление манифеста разрешений
Пожалуйста, не забудьте объявить разрешение в манифесте, которое вам нужно, и вы запрашиваете во время выполнения,

0 голосов
/ 01 июня 2018

Единственное логическое объяснение того, что ваш код для записи «DO CHECK», а не «INSIDE CHECK», заключается в том, что разрешения уже предоставлены.

Перед запросом разрешений, если разрешения уже предоставлены, вы можете сделатьВаши необходимые операции напрямую.

Также вы можете использовать мою библиотеку для простой обработки прав доступа.https://github.com/nabinbhandari/Android-Permissions

0 голосов
/ 01 июня 2018

Возможно, вы уже предоставили разрешение.

Попробуйте переустановить приложение.

0 голосов
/ 01 июня 2018

Попробуйте убедиться, что ваш файл Gradle уровня приложения в последней версии SDK для компиляции.как

  compileSdkVersion 27

, затем после также добавьте разрешение в файл манифеста Android.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

и после проверки разрешения времени выполнения, как показано ниже, создайте два метода.

/**
 * this method check permission and return current state of permission need.
 */
private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}

/**
 * this method request to permission asked.
 */
private void requestPermissions() {
    boolean shouldProvideRationale =
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.ACCESS_FINE_LOCATION);

    if (shouldProvideRationale) {
        Log.i(TAG, "Displaying permission rationale to provide additional context.");
    } else {
        Log.i(TAG, "Requesting permission");
        // previously and checked "Never ask again".
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }
}

/**
 * Callback received when a permissions request has been completed.
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    Log.i(TAG, "onRequestPermissionResult");
    if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
        if (grantResults.length <= 0) {
            // If user interaction was interrupted, the permission request is cancelled and you
            // receive empty arrays.
            Log.i(TAG, "User interaction was cancelled.");
        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission was granted. Kick off the process of building and connecting
            // GoogleApiClient.
            buildGoogleApiClient();
        } else {
            // Permission denied.

        }
    }
}

затемкогда вызовите метод определения местоположения, поставьте, как показано ниже, проверку

 // Check if the user revoked runtime permissions.
    if (!checkPermissions()) {
        requestPermissions();
    }

    buildGoogleApiClient();
0 голосов
/ 01 июня 2018

ActivityCompat.requestPermission не выполняется, и впоследствии onRequestPermissionRationale никогда не вызывается , но в настройках устройства для приложения оно всегда отображается как предоставленное разрешение

Посколькуприложение является старым приложением, и вы уже предоставили необходимые разрешения приложению, ActivityCompat.checkSelfPermission вернет PackageManager.PERMISSION_GRANTED, и вы больше не увидите запрос на разрешение.

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

...