1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhongte-TaoYao

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Тяо Яо

Общие шаги запроса разрешений

  • Определите наличие разрешений; если они есть, переходите к следующему шагу.
  • Если разрешений нет, начните процесс запроса разрешений.
  • Если пользователь предоставляет разрешение, продолжайте выполнение.
  • Если пользователь отклоняет разрешение, повторите запрос разрешений позже. Для того чтобы не мешать пользователю, система больше не будет показывать диалоговое окно с запросом разрешений. После отказа пользователя следует показать диалоговое окно, которое информирует его о необходимости предоставления разрешения для доступа к текущей функциональности, а также направляет его в системные настройки для активации соответствующего разрешения.

    Каждый раз при запросе разрешений необходимо пройти через вышеописанные шаги. По мере увеличения количества запрашиваемых разрешений начинают появляться большие объемы повторяющегося кода. Чтобы минимизировать количество повторяющегося кода, был создан фреймворк для запроса разрешений.

Фреймворк для запроса разрешенийTiao Yao — это фреймворк для запроса разрешений на платформе HarmonyOS, который упаковывает логику запроса разрешений и использует метод цепочки вызовов для запроса разрешений, что значительно упрощает код запроса разрешений. Он поддерживает запрос разрешений внутри 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Тоуяо — это **фреймворк для запросов на разрешение в системе Хунмен**. Он инкапсулирует логику запроса разрешений и позволяет запрашивать разрешения посредством цепных вызовов, что значительно упрощает код запроса разрешений. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zhongte-TaoYao.git
git@api.gitlife.ru:oschina-mirror/zhongte-TaoYao.git
oschina-mirror
zhongte-TaoYao
zhongte-TaoYao
master