Для Marshmallow или более поздних версий разрешения не предоставляются во время установки и должны запрашиваться при необходимости во время выполнения (если они не были предоставлены ранее).
Для этого вам нужно запустить ActivityCompat.requestPermissions()
, чтобы открыть диалоговое окно системных разрешений в вашей деятельности в то время, когда пользователь выполняет действие, требующее дополнительных системных разрешений.
Примером этого для разрешения WRITE_EXTERNAL_STORAGE
может быть:
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE
);
Примечание: WRITE_EXTERNAL_STORAGE_REQUEST_CODE
— это произвольная целочисленная константа, которую вы должны определить в другом месте.
Разрешения, которые вы запрашиваете, также должны быть объявлены в вашем AndroidManifest.xml
. В этом примере объявление будет таким:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Чтобы обработать ответ диалогового окна системных разрешений, вам также необходимо реализовать onRequestPermissionsResult()
в своей деятельности. Для этого примера код будет похож на
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
return; //permission not granted, could also optionally log an error
}
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
//Do whatever you needed the write permissions for
}
}
Если вы автоматизируете свое приложение с помощью Espresso, UIAutomator и/или другой фреймворк для тестирования пользовательского интерфейса, который вам понадобится ожидать и щелкнуть системный диалог во время теста, что можно выполнить с помощью следующего тестового кода:
private void allowPermissionsIfNeeded() {
if (Build.VERSION.SDK_INT >= 23) {
UiObject allowPermissions = mDevice.findObject(new UiSelector().text("Allow"));
if (allowPermissions.exists()) {
try {
allowPermissions.click();
} catch (UiObjectNotFoundException e) {
Timber.e(e, "There is no permissions dialog to interact with ");
}
}
}
}
Более полное объяснение тестирования разрешений пользовательского интерфейса системы доступно здесь.
person
Nathan Dunn
schedule
23.12.2016