HarmonyOS 鸿蒙Next支持三方应用删除系统相册图片吗

HarmonyOS 鸿蒙Next支持三方应用删除系统相册图片吗 【问题描述】:相册管理软件删除系统相册图片,申请ohos.permission.WRITE_IMAGEVIDEO受限权限未通过

【问题现象】:在安卓和ios上可以删除

安卓申请权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

可以在安卓应用市场搜索“滑动相册清理”安装软件查看效果

想问下在鸿蒙上实现类似的功能,需要申请什么权限,或者能提供方案吗?

5 回复

开发者你好,

App是支持删除相册图片的,但是从用户系统相册中移除图片和视频需要申请相册管理模块权限’ohos.permission.READ_IMAGEVIDEO’和’ohos.permission.WRITE_IMAGEVIDEO’。改权限通常是不允许三方应用申请的。如果有特殊场景需要使用,请提供相关申请材料到应用市场(AGC)申请相应权限证书。申请前请参考受限开发权限列表,确保应用符合可申请的场景。然后再参考申请使用受限权限,完成受限开放权限的申请。在调试阶段,可以通过DevEco Studio自动签名完成申请。在自动签名的过程中,将由DevEco Studio完成向AGC申请受限权限的步骤,开发者可直接使用,具体请参考自动签名-操作步骤。发布阶段参考如何添加ACL受限权限

下面以从相册名为’test’的用户相册中移除第一张图片为例:

  1. 到系统相册新建一个名字为’test’的相册。
  2. 新建工程,在配置文件 module.json5 中添加所需用户授权权限如下:
 "requestPermissions":[
      {
        "name" : "ohos.permission.READ_IMAGEVIDEO",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"inuse"
        }
      },
      {
        "name" : "ohos.permission.WRITE_IMAGEVIDEO",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"always"
        }
      }]
  1. 在index文件aboutToAppear中先申请相册读写权限,再点击方法中进行删除系统相册"test"中第一张图片。
import { dataSharePredicates } from '@kit.ArkData';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { abilityAccessCtrl, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';

async function removePhoto(phAccessHelper: photoAccessHelper.PhotoAccessHelper) {
  let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME;
  albumPredicates.equalTo(albumName, 'test');
  let albumFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: albumPredicates
  };

  let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let photoFetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: photoPredicates
  };

  try {
    let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions);
    let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject();
    console.info('getAlbums successfully, albumName: ' + album.albumName);
    let photoFetchResult = await album.getAssets(photoFetchOptions);
    let photoAsset = await photoFetchResult.getFirstObject();
    console.info('album getAssets successfully, albumName: ' + photoAsset.displayName);
    let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album);
    albumChangeRequest.removeAssets([photoAsset]);
    await phAccessHelper.applyChanges(albumChangeRequest);
    console.info('succeed to remove ' + photoAsset.displayName + ' from ' + album.albumName);
    albumFetchResult.close();
    photoFetchResult.close();
  } catch (err) {
    console.error('removeAssets failed with err: ' + err);
  }
}
@Entry
@Component

struct Index {
  @State message: string = 'APP1';
  requestPermissions(permissions: Array<Permissions>): void {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, permissions)
      .then((data: PermissionRequestResult) => {
      })
      .catch((err: Error) => {
      })
  }
  aboutToAppear(): void {
    this.requestPermissions(["ohos.permission.READ_IMAGEVIDEO","ohos.permission.WRITE_IMAGEVIDEO"])
  }
  build() {

    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
          let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
          removePhoto(phAccessHelper);
        })
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next支持三方应用删除系统相册图片吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


提交了审核 审核意见: 暂不支持图片删除功能,感谢支持!

ohos.permission.READ_IMAGEVIDEO仅克隆、备份、同步场景的应用可申请,非克隆、备份、同步场景,请使用非权限的替代方案实现功能。 读取图片/视频/音频可替代方案: 使用Picker选择媒体库资源:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/photoaccesshelper-photoviewpicker-V5 使用PhotoPicker组件访问图片/视频:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/component-guidelines-photoviewpicker-V5

HarmonyOS Next不支持三方应用直接删除系统相册图片。系统相册属于受保护的核心数据区域,应用权限模型严格限制了对其的写入和删除操作,以保障用户数据安全和系统稳定性。三方应用只能管理自身创建或用户明确授权访问的文件。

在HarmonyOS Next中,三方应用无法直接删除系统相册中的图片。这是系统出于安全和用户隐私保护做出的设计。

核心原因与限制:

  1. 权限模型差异:HarmonyOS Next采用了更严格的隐私保护框架。ohos.permission.WRITE_IMAGEVIDEO权限主要用于应用访问和写入自身沙箱公共媒体目录下的媒体文件,并不授予修改或删除其他应用(包括系统相册)创建的媒体文件的权限。
  2. 数据归属与隔离:系统相册(图库)管理的图片数据归属明确,受到系统级保护。三方应用不具备直接操作这些数据的能力,以防止恶意软件随意删除用户珍贵照片。

替代方案与实现路径: 要实现“清理相册”类功能,正确的做法是引导用户在系统图库应用内进行删除操作。你的应用可以:

  • 通过picker选择媒体文件:使用系统提供的PhotoViewPicker等选择器,让用户选取图片。但选择器返回的是文件的Uri副本或临时访问权限,应用删除操作仅作用于自身获取的副本或缓存,不影响系统相册原文件。
  • 管理应用自身的媒体文件:如果你的应用创建或下载了图片,并保存在自身的沙箱或声明的公共媒体目录下,则可以自由管理(包括删除)这些文件。

总结: HarmonyOS Next的设计禁止了三方应用直接删除系统相册图片的行为。应用应遵循“谁创建,谁管理”的原则,专注于管理自身产生的媒体数据。任何需要删除系统相册图片的操作,都必须由用户在系统图库中亲自完成。

回到顶部