Каждый раз при запросе разрешений необходимо пройти через вышеописанные шаги. По мере увеличения количества запрашиваемых разрешений начинают появляться большие объемы повторяющегося кода. Чтобы минимизировать количество повторяющегося кода, был создан фреймворк для запроса разрешений.
UI
, UIAbility
, UIExtensionAbility
. Важно отметить, что при запросе разрешений внутри UIExtensionAbility
необходимо выполнять запрос после завершения выполнения функции onWindowStageCreate
или в её обратном вызове.Проект основан на открытой версии HarmonyOS 5.0 и совместим с API 12 и выше. Убедитесь, что DevEco Studio установлен до последней версии.
Название "Тяо Яо" взято из древнего сборника стихотворений "Шэжинь", где говорится: "Тяо-тяо тяо, зоро-зоро цвет". Это значит, что тысячи цветков сливы распустились, а их цвет так ярок, словно горящий огонь.
ohpm install @shijing/taoyao
TaoYao.with(this)
.runtime()
// Разрешения, которые требуется запросить
.permission(permissions)
.onGranted(() => {
// Запрос разрешений выполнен успешно
})
.onDenied(() => {
// Запрос разрешений провалился
})
.request()
Запрос разрешений стал таким простым.
Разрешение для чтения информации о медиафайлах из внешних хранилищ пользователя
ohos.permission.READ_MEDIA
Разрешение для чтения и записи информации о медиафайлах из внешних хранилищ пользователя
ohos.permission.WRITE_MEDIA
С версии 5.0, API 12 эти два разрешения стали устаревшими. Рекомендованное решение (не требует запроса разрешений): использование выборщиков изображений/видео для чтения медиафайлов из медиабиблиотеки; использование контролов сохранения для сохранения изображений/видео в медиабиблиотеку.### Переход к системным настройкам
На нижеприведенной картинке представлена страница системы для настроек разрешений.
Ниже представлена схема всплывающего окна настроек системных прав.
До API 12 можно было только перейти на страницу системных прав. С API 12 и выше можно сразу открыть диалоговое окно с запросом прав, что позволяет лучше направить пользователя к предоставлению этих прав. Преимуществом является то, что после закрытия системного диалогового окна можно сразу узнать, предоставлены ли права.
По умолчанию, приложение ТаоЯо будет открывать системное окно с запросом прав. После того как окно закрывается, состояние прав будет передано обратно через коллбэк.
Однако возможно, что попытка открыть системное окно с запросом прав может завершиться ошибкой. В частности, для чтения данных о здоровье (ohos.permission.READ_HEALTH_DATA) невозможно сразу открыть системное окно с запросом прав; требуется переход на страницу системных настроек.
Если попытка открыть системное окно с запросом прав завершилась ошибкой, это сообщение будет отправлено в коллбэке onFailed
. Если всё же требуется проверить наличие прав после перехода на страницу системных настроек, можно запросить права внутри метода onPageShow
.```javascript
TaoYao.showSystemPermissionDialog(this.context, this.permissions)
.onGranted(() => {
// After successfully opening the system window to request permissions, if the user grants the permissions
this.toast('After opening the system window to request permissions, permissions granted');
})
.onDenied(() => {
// After successfully opening the system window to request permissions, if the user does not grant the permissions
this.toast('After opening the system window to request permissions, permissions denied');
})
.onFailed(() => {
// If it is impossible to open the system window to request permissions, you need to go to the system settings page
console.log('Impossible to open the system window to request permissions, need to go to the system settings page');
});
Система предлагает режим сверхконфиденциальности. Когда этот режим активирован в настройках системы, камера, микрофон и местоположение становятся недоступными. После получения доступа к камерным, аудио и геолокационным правам, если режим сверхконфиденциальности активирован, следует направить пользователя к деактивации этого режима.```javascript
if (!TaoYao.isLocationEnabled()) {
// Активирован режим сверхконфиденциальности или выключен переключатель локализации, откроем глобальное окно с запросом активации/деактивации режима
TaoYao.requestLocationGlobalSwitch(context).then(isOpen => {
if (isOpen) {
// Переключатель локализации открыт
} else {
// Переключатель локализации закрыт
}
});
}
}))
} else {
// Локационный режим включен
}
TaoYao.isMicrophoneMute().then(isMute => {
if (isMute) {
// Включен режим максимальной конфиденциальности, микрофон отключен, показывается глобальное окно с запросом пользователя выключить этот режим
TaoYao.requestMicrophoneGlobalSwitch(context).then((isOpen => {
if (isOpen) {
// Микрофон включен
} else {
// Микрофон отключен
}
}))
} else {
// Микрофон включен
}
})
if (TaoYao.isCameraMuted(context)) {
// Включен режим максимальной конфиденциальности, камера недоступна, показывается глобальное окно с запросом пользователя выключить этот режим
TaoYao.requestCameraGlobalSwitch(context).then(isOpen => {
if (isOpen) {
// Камера включена
} else {
// Камера отключена
}
})
} else {
// Камера включена
}
Если пользователь отклоняет запрос на права на уведомления, можно лишь перейти в системные настройки, так как диалоговое окно системы не поддерживает запросы на права на уведомления
TaoYao.with(this.context)
.notification()
.permission()
.```javascript
onGranted(() => {
// Успешный запрос прав на уведомления
this.toast()
})
.onDenied(() => {
// Для отказа в правах на уведомления можно лишь перейти в системные настройки
TaoYao.goToSettingPage(this.context)
})
.request()
Иногда требуется лишь проверить наличие прав во время выполнения, но не запрашивать их.
/**
* Проверка наличия прав, если нет прав, то они не будут запрошены
*
* @param permissions
* @returns true если есть права
*/
static hasPermission(permissions: Array<Permissions>): boolean {
const generalChecker = new GeneralChecker()
return generalChecker.hasPermission(permissions)
}
Проверка наличия прав на уведомления, если таких прав нет, то они не будут запрошены.
/**
* Проверка наличия прав на уведомления, если таких прав нет, то они не будут запрошены
*
* @returns Promise<boolean>, где true — поддерживается, false — не поддерживается
*/
static isNotificationEnabled(): Promise<boolean> {
return NotificationPermissionChecker.isNotificationEnabled()
}
/**
* Проверка поддержки распределённых уведомлений
*
* @returns true если поддерживается, false если не поддерживается
*/
```markdown
### Системный выборщик
Системный выборщик уже получил предварительное разрешение на соответствующие права, поэтому разработчики могут использовать системный выборщик без повторной заявки на права для временного ограниченного доступа к соответствующим ресурсам.
```Например, когда приложение требует чтения пользовательских изображений, это можно сделать с помощью фотографического выборщика. После того как пользователь выберет нужное изображение, оно будет возвращено непосредственно, без необходимости предоставления приложению прав на чтение файлов изображений.
<br/>
```#### Контактный выборщик
Получение контактов через контактный выборщик не требует получения разрешения на доступ к адресной книге.
TaoYao.with(this.context) .contact() .onSuccess((data) => { // список контактов if (data.length > 0) { // имя контакта console.log("yunfei", data[0].name ? .fullName); // номер телефона контакта console.log("yunfei", data[0]?.phoneNumbers?.[0]?.phoneNumber); } }) .onError((err) => { console.log(err.message); }) .selectContacts(new ContactBuilder() // возможность выбора нескольких контактов .setMultiSelect(true));#### Камера выборщика Запуск системы камеры не требует получения разрешения на использование камеры.
TaoYao.with(this.context)
.camera()
.onSuccess((uri) => {
// путь к файлу снимка или видео в песочнице
console.log(uri);
})
.onError((err) => {
console.log(err.stack);
})
.openSystemCamera(new CameraBuilder()
// задний модуль камеры, используется по умолчанию
.setCameraSelector(CameraSelector.CAMERA_POSITION_BACK)
// можно выбрать только фото или только видео, по умолчанию выбираются оба
.setUseCase([UseCase.PHOTO, UseCase.VIDEO])
// путь сохранения файла, может быть не указан
//.setSaveUri("")
// максимальная длительность записи видео, может быть не указана
//.setVideoMaxDuration());
);
Запуск системного хранилища изображений и видео не требует получения разрешения на хранение данных, позволяет получить только выбранные изображения и видео.
TaoYao.with(this.context)
.media()
.onSuccess((uris) => {
uris.forEach((uri) => {
console.log("yunfei", uri);
});
})
.onError((err) => {
console.log(err.stack);
})
.select(new MediaBuilder()
// максимальное количество выбранных медиафайлов
.setMaxSelectNumber(10)
// типы медиафайлов, которые могут быть выбраны, тип изображений, тип видео, тип изображений и видео, тип анимированного изображения
.setMediaMineType(MediaMimeType.IMAGE_VIDEO_TYPE));
```#### Выборщик документов
Запуск системы выборщика документов не требует получения разрешений, позволяет получить только выбранные документы.
```javascript
TaoYao.with(this.context)
.document()
.onSuccess((uris) => {
uris.forEach((uri) => {
console.log("yunfei", uri);
});
})
.onError((err) => {
console.log(err.stack);
})
#### Выборщик документов
```Выборщик документов не требует специальных разрешений, но позволяет выбрать до 10 медиафайлов.
```javascript
select(new DocumentBuilder()
// Ограничение максимального количества выбранных файлов
.setMaxSelectNumber(10)
// Указание пути к файлу или директории по умолчанию (необязательно)
//.setDefaultFilePathUri("")
// Разрешение доступа к выбранному файлу или директории, true — разрешено, false — запрещено (необязательно)
//.setAuthMode(false)
// Фильтрация типов файлов ['описание типа файла | расширение файла'] (необязательно)
// Например: ['Изображения (.png, .jpg)|.png,.jpg', 'Документы|.txt', 'Видео|.mp4', '.pdf']
.setFileSuffixFilters(['Документы|.docx'])
)
Аудио выборщик не требует специальных разрешений, но позволяет получить информацию о выбранных аудиофайлах.
TaoYao.with(this.context)
.audio()
.onSuccess((uris) => {
uris.forEach((uri) => {
console.log("yunfei", uri);
});
})
.onError((err) => {
console.log(err.stack);
})
// На данный момент аудио выборщик не поддерживает конфигурирование параметров, по умолчанию можно выбрать все типы аудиофайлов.
.select(new AudioBuilder());
Реализация подробно описана в статье Практика HarmonyOS: реализация системы запроса прав.
Проект был создан с учетом открытого проекта AndPermission, благодарю автора за его работу.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )