# uni.requestSystemPermission(options)

申请系统权限

# requestSystemPermission 兼容性 ?

Web 微信小程序 Android iOS HarmonyOS
x x 5.25 x 5.25

# 参数

名称 类型 必填 兼容性 描述
options RequestSystemPermissionOptions
请求系统权限参数
名称 类型 必备 兼容性 描述
permissions Array<string>
申请的系统权限列表
success (result: RequestSystemPermissionSuccess) => void
申请系统权限成功回调
fail (result: RequestSystemPermissionFail) => void
complete (result: any) => void

# RequestSystemPermissionSuccess 的属性值

名称 类型 必备 兼容性 描述
grantedList Array<string>
已授权权限列表,仅包含当前系统支持的权限
deniedList Array<string>
已拒绝权限列表
doNotAskAgainList Array<string>
不在询问权限列表

# RequestSystemPermissionFail 的属性值

名称 类型 必备 兼容性 描述
errCode number
错误码
合法值 兼容性 描述
1560601
申请权限为空
1560604
不支持申请权限
errSubject string
统一错误主题(模块)名称
data any
错误信息中包含的数据
cause Error 源错误信息,可以包含多个错误,详见SourceError
errMsg string

# 示例

示例为hello uni-app x alpha分支,与最新HBuilderX Alpha版同步。与最新正式版同步的master分支示例另见

该 API 不支持 Web,请运行 hello uni-app x 到 App 平台体验

扫码体验(手机浏览器跳转到App直达页)
<template>
  <scroll-view class="page-scroll-view">
    <page-head title="requestSystemPermission"></page-head>
    <view class="uni-padding-wrap uni-common-mt">
      <view class="uni-list">
        <view class="uni-list-cell">
          <view class="uni-list-cell-db">
            <textarea
              class="permission-input"
              v-model="data.permissionText"
              placeholder="请输入权限名称,多个权限使用逗号分隔"
            />
          </view>
        </view>
      </view>

      <view class="uni-btn-v uni-common-mt">
        <!-- #ifdef APP-HARMONY -->
        <button @tap="selectAccelerometer">加速度计权限</button>
        <button @tap="selectLocation">定位权限</button>
        <button @tap="selectUnconfigured">未配置权限</button>
        <!-- #endif -->
        <!-- #ifdef APP-ANDROID -->
        <button @tap="selectCamera">相机权限</button>
        <button @tap="selectLocation">定位权限</button>
        <!-- #endif -->
        <button id="request-permission" type="primary" @tap="requestPermission">申请权限</button>
      </view>

      <view class="result uni-common-mt">
        <text class="result-title">申请结果</text>
        <text class="result-text">状态:{{ data.status }}</text>
        <text class="result-text">errCode:{{ data.errCode }}</text>
        <text class="result-text">errMsg:{{ data.errMsg }}</text>
        <text class="result-text">grantedList:{{ (data.grantedList).join(', ') }}</text>
        <text class="result-text">deniedList:{{ (data.deniedList).join(', ') }}</text>
        <text class="result-text">doNotAskAgainList:{{ (data.doNotAskAgainList).join(', ') }}</text>
      </view>
    </view>
  </scroll-view>
</template>

<script setup lang="uts">
  // #ifdef APP-HARMONY
  const DEFAULT_PERMISSION = 'ohos.permission.ACCELEROMETER'
  const ACCELEROMETER_PERMISSION = 'ohos.permission.ACCELEROMETER'
  const LOCATION_PERMISSIONS = 'ohos.permission.APPROXIMATELY_LOCATION, ohos.permission.LOCATION'
  const UNCONFIGURED_PERMISSION = 'ohos.permission.ACCESS_BLUETOOTH'
  // #endif
  // #ifdef APP-ANDROID
  const DEFAULT_PERMISSION = 'android.permission.CAMERA'
  const CAMERA_PERMISSION = 'android.permission.CAMERA'
  const LOCATION_PERMISSIONS = 'android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION'
  // #endif

  type DataType = {
    permissionText: string
    status: string
    errCode: number
    errMsg: string
    grantedList: string[]
    deniedList: string[]
    doNotAskAgainList: string[]
    complete: boolean
  }

  const data = reactive({
    permissionText: DEFAULT_PERMISSION,
    status: '待申请',
    errCode: 0,
    errMsg: '',
    grantedList: [] as string[],
    deniedList: [] as string[],
    doNotAskAgainList: [] as string[],
    complete: false
  } as DataType)

  // #ifdef APP-HARMONY
  const selectAccelerometer = () => {
    data.permissionText = ACCELEROMETER_PERMISSION
  }
  // #endif

  // #ifdef APP-ANDROID
  const selectCamera = () => {
    data.permissionText = CAMERA_PERMISSION
  }
  // #endif

  const selectLocation = () => {
    data.permissionText = LOCATION_PERMISSIONS
  }

  // #ifdef APP-HARMONY
  const selectUnconfigured = () => {
    data.permissionText = UNCONFIGURED_PERMISSION
  }
  // #endif

  const resetResult = () => {
    data.status = '申请中'
    data.errCode = 0
    data.errMsg = ''
    data.grantedList = [] as string[]
    data.deniedList = [] as string[]
    data.doNotAskAgainList = [] as string[]
    data.complete = false
  }

  const request = (permissions: string[]) => {
    resetResult()
    uni.requestSystemPermission({
      permissions,
      success: (res) => {
        data.status = '申请成功'
        data.grantedList = res.grantedList
        data.deniedList = res.deniedList
        data.doNotAskAgainList = res.doNotAskAgainList
      },
      fail: (err) => {
        data.status = '申请失败'
        data.errCode = err.errCode
        data.errMsg = err.errMsg
      },
      complete: () => {
        data.complete = true
      }
    })
  }

  const requestPermission = () => {
    const permissions = data.permissionText
      .split(',')
      .map((permission) => permission.trim())
      .filter((permission) => permission.length > 0)
    request(permissions)
  }

  const jestRequestPermissions = () => {
    request([DEFAULT_PERMISSION])
  }

  const jestRequestEmptyPermissions = () => {
    request([])
  }

  // #ifdef APP-HARMONY
  const jestRequestUnconfiguredPermission = () => {
    request([UNCONFIGURED_PERMISSION])
  }
  // #endif

  // #ifdef APP-HARMONY
  defineExpose({
    data,
    jestRequestPermissions,
    jestRequestEmptyPermissions,
    jestRequestUnconfiguredPermission
  })
  // #endif

  // #ifdef APP-ANDROID
  defineExpose({
    data,
    jestRequestPermissions,
    jestRequestEmptyPermissions
  })
  // #endif
</script>

<style>
  .permission-input {
    width: 100%;
    height: 100px;
    padding: 10px;
    box-sizing: border-box;
  }

  .result {
    padding: 12px;
    border: 1px solid #dddddd;
  }

  .result-title {
    font-size: 18px;
    font-weight: bold;
    margin-bottom: 8px;
  }

  .result-text {
    margin-bottom: 6px;
  }
</style>

# 参见

# 示例

示例为hello uni-app x alpha分支,与最新HBuilderX Alpha版同步。与最新正式版同步的master分支示例另见

该 API 不支持 Web,请运行 hello uni-app x 到 App 平台体验

扫码体验(手机浏览器跳转到App直达页)
<template>
  <scroll-view class="page-scroll-view">
    <page-head title="requestSystemPermission"></page-head>
    <view class="uni-padding-wrap uni-common-mt">
      <view class="uni-list">
        <view class="uni-list-cell">
          <view class="uni-list-cell-db">
            <textarea
              class="permission-input"
              v-model="data.permissionText"
              placeholder="请输入权限名称,多个权限使用逗号分隔"
            />
          </view>
        </view>
      </view>

      <view class="uni-btn-v uni-common-mt">
        <!-- #ifdef APP-HARMONY -->
        <button @tap="selectAccelerometer">加速度计权限</button>
        <button @tap="selectLocation">定位权限</button>
        <button @tap="selectUnconfigured">未配置权限</button>
        <!-- #endif -->
        <!-- #ifdef APP-ANDROID -->
        <button @tap="selectCamera">相机权限</button>
        <button @tap="selectLocation">定位权限</button>
        <!-- #endif -->
        <button id="request-permission" type="primary" @tap="requestPermission">申请权限</button>
      </view>

      <view class="result uni-common-mt">
        <text class="result-title">申请结果</text>
        <text class="result-text">状态:{{ data.status }}</text>
        <text class="result-text">errCode:{{ data.errCode }}</text>
        <text class="result-text">errMsg:{{ data.errMsg }}</text>
        <text class="result-text">grantedList:{{ (data.grantedList).join(', ') }}</text>
        <text class="result-text">deniedList:{{ (data.deniedList).join(', ') }}</text>
        <text class="result-text">doNotAskAgainList:{{ (data.doNotAskAgainList).join(', ') }}</text>
      </view>
    </view>
  </scroll-view>
</template>

<script setup lang="uts">
  // #ifdef APP-HARMONY
  const DEFAULT_PERMISSION = 'ohos.permission.ACCELEROMETER'
  const ACCELEROMETER_PERMISSION = 'ohos.permission.ACCELEROMETER'
  const LOCATION_PERMISSIONS = 'ohos.permission.APPROXIMATELY_LOCATION, ohos.permission.LOCATION'
  const UNCONFIGURED_PERMISSION = 'ohos.permission.ACCESS_BLUETOOTH'
  // #endif
  // #ifdef APP-ANDROID
  const DEFAULT_PERMISSION = 'android.permission.CAMERA'
  const CAMERA_PERMISSION = 'android.permission.CAMERA'
  const LOCATION_PERMISSIONS = 'android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION'
  // #endif

  type DataType = {
    permissionText: string
    status: string
    errCode: number
    errMsg: string
    grantedList: string[]
    deniedList: string[]
    doNotAskAgainList: string[]
    complete: boolean
  }

  const data = reactive({
    permissionText: DEFAULT_PERMISSION,
    status: '待申请',
    errCode: 0,
    errMsg: '',
    grantedList: [] as string[],
    deniedList: [] as string[],
    doNotAskAgainList: [] as string[],
    complete: false
  } as DataType)

  // #ifdef APP-HARMONY
  const selectAccelerometer = () => {
    data.permissionText = ACCELEROMETER_PERMISSION
  }
  // #endif

  // #ifdef APP-ANDROID
  const selectCamera = () => {
    data.permissionText = CAMERA_PERMISSION
  }
  // #endif

  const selectLocation = () => {
    data.permissionText = LOCATION_PERMISSIONS
  }

  // #ifdef APP-HARMONY
  const selectUnconfigured = () => {
    data.permissionText = UNCONFIGURED_PERMISSION
  }
  // #endif

  const resetResult = () => {
    data.status = '申请中'
    data.errCode = 0
    data.errMsg = ''
    data.grantedList = [] as string[]
    data.deniedList = [] as string[]
    data.doNotAskAgainList = [] as string[]
    data.complete = false
  }

  const request = (permissions: string[]) => {
    resetResult()
    uni.requestSystemPermission({
      permissions,
      success: (res) => {
        data.status = '申请成功'
        data.grantedList = res.grantedList
        data.deniedList = res.deniedList
        data.doNotAskAgainList = res.doNotAskAgainList
      },
      fail: (err) => {
        data.status = '申请失败'
        data.errCode = err.errCode
        data.errMsg = err.errMsg
      },
      complete: () => {
        data.complete = true
      }
    })
  }

  const requestPermission = () => {
    const permissions = data.permissionText
      .split(',')
      .map((permission) => permission.trim())
      .filter((permission) => permission.length > 0)
    request(permissions)
  }

  const jestRequestPermissions = () => {
    request([DEFAULT_PERMISSION])
  }

  const jestRequestEmptyPermissions = () => {
    request([])
  }

  // #ifdef APP-HARMONY
  const jestRequestUnconfiguredPermission = () => {
    request([UNCONFIGURED_PERMISSION])
  }
  // #endif

  // #ifdef APP-HARMONY
  defineExpose({
    data,
    jestRequestPermissions,
    jestRequestEmptyPermissions,
    jestRequestUnconfiguredPermission
  })
  // #endif

  // #ifdef APP-ANDROID
  defineExpose({
    data,
    jestRequestPermissions,
    jestRequestEmptyPermissions
  })
  // #endif
</script>

<style>
  .permission-input {
    width: 100%;
    height: 100px;
    padding: 10px;
    box-sizing: border-box;
  }

  .result {
    padding: 12px;
    border: 1px solid #dddddd;
  }

  .result-title {
    font-size: 18px;
    font-weight: bold;
    margin-bottom: 8px;
  }

  .result-text {
    margin-bottom: 6px;
  }
</style>

# 通用类型

# GeneralCallbackResult

名称 类型 必备 描述
errMsg string 错误信息