Разрешение: для вызова требуется разрешение, которое может быть отклонено пользователем - PullRequest
0 голосов
/ 22 октября 2018

При компиляции в Android Studio я получаю предупреждение, как указано в заголовке этого поста.Я пытался получать обновления GPS с помощью следующего кода:

    try {
        LocMgr = (LocationManager)getSystemService( LOCATION_SERVICE );
        LocMgr.requestLocationUpdates( K.GPS_PROVIDER, 0, 0, this );
        //LocMgr.addNmeaListener( this );   // NMEA
    }
    catch(Exception e) {
        UI.warningBox( this, "GPS appears to be either absent or disabled" );
    }

Как ни странно, мое приложение все еще работает просто отлично без каких-либо запросов во время выполнения для получения разрешения.Я сделал , однако запросил разрешение в манифесте.

    uses-permission  android:name="android.permission.ACCESS_FINE_LOCATION"
    uses-permission  android:name="android.permission.ACCESS_COARSE_LOCATION"

Я не несчастен, но я ожидал сбой или, по крайней мере, исключение безопасности.

Почему Android Studio так (неожиданно) прощает?

Кстати, скрипт моего модуля gradle включает

    defaultConfig {
    applicationId "MY_APP_ID"
    minSdkVersion 11
    targetSdkVersion 26
    }

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Ваше приложение не запрашивает разрешение во время выполнения, потому что вы не добавили код в.Кроме того, на последних версиях Android было добавлено разрешение во время выполнения (я полагаю, оно было запущено на Android M).

Итак, в предыдущих версиях Android ваше приложение будет работать нормально, поскольку вам просто нужно добавить разрешение в манифест.

В новых версиях необходимо дополнительно запросить разрешение во время выполнения. Отсутствие разрешения не всегда приводит к сбою. Они могут генерировать только предупреждение в журналах и т. Д.

В любом случае, чтобы избавиться от этого предупреждения, вы должны запросить разрешение во время выполнения.Ниже вы можете найти небольшой пример:

public class MainActivity extends AppCompatActivity implements LocationListener {

    private final static int LOCATION_PERMISSION_CODE = 1;

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

        ....

        try {
            LocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);

            if (ActivityCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
                  && ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // Missing both permissions. User didn't accept them yet. Request
                ActivityCompat.requestPermissions(this, new String[] {permission.ACCESS_FINE_LOCATION, permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_CODE);
            } else {
                // Have permissions. Don't need to request. Just request location
                LocMgr.requestLocationUpdates( K.GPS_PROVIDER, 0, 0, this );
            }
        } catch(Exception e) {
            UI.warningBox( this, "GPS appears to be either absent or disabled" );
        }

        ....
    }

    @Override
    public void onRequestPermissionsResult(final int requestCode,
            @NonNull final String[] permissions,
            @NonNull final int[] grantResults) {
        if(requestCode == LOCATION_PERMISSION_CODE) {
            if(grantResults.length > 1
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED /* ACCESS_FINE_LOCATION */
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED /* ACCESS_COARSE_LOCATION */) {
                // User accepted both permissions. request location updates
                LocMgr.requestLocationUpdates( K.GPS_PROVIDER, 0, 0, this );
            }
        }
    }
}
0 голосов
/ 22 октября 2018

Какую версию Android вы используете для запуска своего приложения?до появления зефира (уровень API 23) вы могли получить доступ ко многим службам, таким как LocationService, фактически не запрашивая разрешения у пользователя.

Вы даже можете использовать Wi-Fi и Bluetooth, не спрашивая разрешения.тогда это был дикий запад разрешений.с тех пор это изменилось, и поскольку ваш API верхнего уровня потенциально может запрашивать разрешения (которые вы не обрабатываете), поэтому вы получаете предупреждение

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

...