对讲录制权限

在 IPC 面板开发过程中,针对对讲、录制、截图等功能需要主动获取对应权限

  • 对讲功能:麦克风权限 (scope.record)
  • 录制、截图功能:存储写入 相册/存储 权限 (scope.writePhotosAlbum)

问题背景

  • 在自定义调用需要权限的功能时, 在 ios、android 等手机系统,首次申请相关权限时,系统会弹出权限申请弹窗,用户可以选择允许或拒绝。

  • ⚠️ 一旦用户拒绝,系统将不再自动弹窗,且现有 API 无法再次触发系统权限申请弹窗。此时调用权限相关 API 会报错,需要开发者主动引导用户前往系统设置手动开启权限。

推荐方案

1. 对讲功能

开启对讲

  1. 获取麦克风权限状态 (ty.authorizeStatus)
  2. 若返回 (fail),表示从未申请过 → 调用 (ty.authorize) 申请权限
  3. 若 (ty.authorize) 仍返回 (fail) → 用户曾拒绝权限 → 显示自定义弹窗引导去系统设置
  4. 其余成功 (success) 回调,表示用户已授权,可直接调用对讲功能

示例代码


import { showModal, openAppSystemSettingPage } from '@ray-js/ray';

// 自定义弹窗引导用户去设置中开启权限
const showCustomDialog = () => {
  showModal({
    title: '',
    content: '您当前没有 麦克风 的访问权限, 请在设置中打开此权限'
    cancelText: '取消',
    confirmText: '去设置',
    isShowGlobal: true,
    success: res => {
        if (res.confirm) {
        // 跳转到应用设置页面
        openAppSystemSettingPage({
            scope: 'App-Settings',
            success: () => {
            console.log('跳转成功');
            },
        });
        }
    },
    });
};

const startTalkTest = () => {
    // 1.获取麦克风权限状态
    ty.authorizeStatus({
        scope: 'scope.record',
        success: () => {
            // 用户已授权,可直接调用对讲功能
        },
        fail: () => {
           // 2. 用户未申请过权限,调用申请麦克风权限
           ty.authorize({
                scope: 'scope.record',
                success: success => {
                  // 权限已通过,可直接调用对讲功能
                },
                fail: err => {
                  // 3. 用户曾拒绝过权限,需自行引导用户手动去设置中开启权限
                  showCustomModal();
                },
              });
        }
    })
}

2. 录制截图功能

开启录制或截图

  1. 获取 相册/存储 权限状态 (ty.authorizeStatus)
  2. 若返回 (fail),表示从未申请过 → 调用 (ty.authorize)
  3. 若 (ty.authorize) 返回 (fail) → 用户曾拒绝 → 引导去系统设置手动开启
  4. 若返回 (success) → 表示权限已开启,可直接使用录制或截图功能

💡 注意 录制功能开启后,需在3秒后再调用录制结束功能, 否则大概率报错

示例代码


import { showModal, openAppSystemSettingPage } from '@ray-js/ray';

// 自定义弹窗引导用户去设置中开启权限
const showCustomDialog = () => {
  showModal({
    title: '',
    content: '您当前没有 相册/存储 的访问权限, 请在设置中打开此权限'
    cancelText: '取消',
    confirmText: '去设置',
    isShowGlobal: true,
    success: res => {
        if (res.confirm) {
        // 跳转到应用设置页面
        openAppSystemSettingPage({
            scope: 'App-Settings',
            success: () => {
            console.log('跳转成功');
            },
        });
        }
    },
    });
};

const startRecordTest = () => {
    // 1.获取写入 相册/存储 权限状态
    ty.authorizeStatus({
        scope: 'scope.writePhotosAlbum',
        success: () => {
            // 用户已授权,可直接调用录制或截图功能
        },
        fail: () => {
           // 2. 用户未申请过权限,调用申请 相册/存储 权限
           ty.authorize({
                scope: 'scope.writePhotosAlbum',
                success: success => {
                  // 权限已通过,可直接调用录制或截图功能
                },
                fail: err => {
                  // 3. 用户曾拒绝过权限,需自行引导用户手动去设置中开启权限
                  showCustomModal();
                },
              });
        }
    })
}