鸿蒙Next photohelper.select返回13900002错误怎么解决

在使用鸿蒙Next的photohelper.select方法时,遇到返回错误代码13900002的问题,该如何解决?具体场景是调用该方法选择图片时直接报错,不知道是什么原因导致的。希望能提供排查思路或解决方案,谢谢!

2 回复

鸿蒙Next开发中,photohelper.select返回13900002错误通常表示权限问题参数错误。可尝试以下步骤排查:

  1. 检查权限配置

    • module.json5中确认已声明ohos.permission.READ_IMAGEVIDEO权限
    • 对于API 10+需同步在AppScope/app.json5中声明
  2. 验证参数格式

    // 确保select参数正确
    let options: photoAccessHelper.PhotoSelectOptions = {
      maxSelectNumber: 5,  // 不能为0
      MIMEType: [photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE] // 类型需有效
    };
    
  3. 运行时权限申请

    // 在调用select前动态申请权限
    await abilityAccessCtrl.createAtManager().requestPermissionsFromUser(
      this.context, 
      ['ohos.permission.READ_IMAGEVIDEO']
    );
    
  4. 检查资源路径

    • 确认使用的媒体库Uri路径有效(如'datashare:///media'

若仍报错,建议:

  • 查看hilog完整错误日志
  • 重启模拟器/真机
  • 更新HarmonyOS SDK至最新版本

更多关于鸿蒙Next photohelper.select返回13900002错误怎么解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,13900002 错误是鸿蒙(HarmonyOS)应用开发中一个常见的权限问题。具体到 photoHelper.select API,这个错误码表示 应用没有申请或用户没有授予所需的文件读取权限

错误原因分析

当您调用 photoHelper.select 让用户从图库中选择照片时,应用需要具备读取用户外部存储(即照片、媒体文件)的权限。如果权限缺失,操作就会失败并返回 13900002。

解决方案

请按照以下步骤逐一排查和解决:

1. 在 module.json5 中声明权限

首先,您必须在应用的配置文件中声明所需的权限。对于读取外部存储,您需要 ohos.permission.READ_IMAGEVIDEO 权限。

代码示例:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_IMAGEVIDEO",
        "reason": "$string:reason", // 在资源文件中定义的权限申请原因
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      }
    ]
  }
}

注意: 请确保 abilities 数组里填写的是您实际使用该权限的 Ability 名称(通常是 EntryAbility)。

2. 在代码中动态申请权限

仅仅声明权限是不够的,在应用运行时,您必须在调用 photoHelper.select 之前,动态地向用户申请授权。

代码示例:

// 导入所需的模块
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
import photoAccessHelper from '@ohos.photoAccessHelper';

// 1. 定义需要申请的权限列表
let permissions: Array<string> = ['ohos.permission.READ_IMAGEVIDEO'];

// 2. 获取访问控制管理器
let atManager = abilityAccessCtrl.createAtManager();

// 3. 申请权限
async function requestPermissions() {
  try {
    let data = await atManager.requestPermissionsFromUser(getContext(this), permissions);
    // 4. 检查授权结果
    if (data.authResult[0] == 0) {
      // 用户已授权,现在可以安全地调用 photoHelper.select
      console.info('权限申请成功');
      // 在这里调用您的 selectPhoto 方法
      selectPhoto();
    } else {
      // 用户拒绝了授权
      console.error('用户拒绝了文件读取权限,无法选择图片。');
      // 可以给用户一个提示,引导他去设置中开启权限
    }
  } catch (err) {
    console.error(`申请权限失败,错误代码:${err.code}, 错误信息:${err.message}`);
  }
}

// 您的选择图片函数
async function selectPhoto() {
  try {
    let phHelper = photoAccessHelper.getPhotoAccessHelper(getContext(this));
    let result = await phHelper.select(
      // ... 您的选择器配置,例如:
      {
        type: photoAccessHelper.PhotoType.IMAGE,
        count: 1
      }
    );
    console.info(`选择成功,URI: ${result[0]}`);
    // 处理选择的图片...
  } catch (err) {
    console.error(`选择图片失败,错误代码:${err.code}, 错误信息:${err.message}`);
  }
}

// 在您的按钮点击事件或其他触发逻辑中,先调用权限申请
// 例如:在 aboutToAppear 或一个按钮的 onClick 事件中调用 requestPermissions()

总结与要点

  1. 双步走:必须完成 静态声明(在 module.json5 中)和 动态申请(在代码中调用 requestPermissionsFromUser)两个步骤。
  2. 时机:确保在调用 photoHelper.select 之前,权限已经被成功授予。最好的做法就是在触发选择图片动作的入口函数里先进行权限检查与申请。
  3. 用户体验:如果用户拒绝了权限,应该给出友好的提示,说明为什么需要这个权限,并可以引导用户到系统的“设置”中手动为您的应用开启权限。

按照以上步骤操作,应该就能解决 13900002 错误。如果问题依旧,请检查开发环境、SDK版本是否最新,并确认 module.json5 的语法是否正确。

回到顶部