跳到主要内容

使用AlbumPicker组件访问相册列表

开发者可以在布局中嵌入AlbumPickerComponent组件,通过此组件,应用无需申请权限,即可访问公共目录中的相册列表。

需配合使用PhotoPicker组件访问图片/视频一起使用,用户通过AlbumPickerComponent组件选择对应相册并通知PhotoPickerComponent组件刷新成对应相册的图片和视频。

界面效果如图所示。

开发步骤

  1. 导入相册组件模块文件。

    import {
    AlbumPickerComponent,
    AlbumPickerOptions,
    AlbumInfo,
    PickerColorMode,
    PickerController,
    DataType
    } from '@kit.MediaLibraryKit';
  2. 创建相册组件配置选项实例(AlbumPickerOptions)。

    通过AlbumPickerOptions,开发者可配置相册页主题颜色,详见AlbumPickerOptions API参考

    // 用于相册组件初始化时设置参数信息。
    albumOptions: AlbumPickerOptions = new AlbumPickerOptions();
    pickerController: PickerController = new PickerController();
  3. 初始化组件配置选项实例(AlbumPickerOptions)。

    /**
    * 设置相册页颜色模式, 默认AUTO。
    * AUTO:跟随系统的模式,LIGHT:浅色模式,DARK:深色模式。
    */
    this.albumOptions.themeColorMode = PickerColorMode.AUTO;
  4. 创建AlbumPickerComponent组件。

    AlbumPickerComponent({
    // 设置组件选择选项实例。
    albumPickerOptions: this.albumOptions,

    /**
    *相册被选中回调,返回相册信息。
    * AlbumInfo(uri)
    */
    onAlbumClick: (albumInfo: AlbumInfo): boolean => this.onAlbumClick(albumInfo),
    })
  5. 与PhotoPicker组件联动,将相册URI给到应用,根据相册URI更新PhotoPicker组件宫格页内容。

    private onAlbumClick(albumInfo: AlbumInfo): boolean {
    if (albumInfo?.uri) {
    // 根据相册url更新宫格页内容。
    this.pickerController.setData(DataType.SET_ALBUM_URI, albumInfo.uri);
    }
    return true;
    }

完整示例

import {
PhotoPickerComponent,
AlbumPickerComponent,
AlbumPickerOptions,
AlbumInfo,
PickerColorMode,
PickerController,
DataType
} from '@kit.MediaLibraryKit';

@Entry
@Component
struct AlbumPage {
@State pickerController: PickerController = new PickerController();
@State Width: string = '100%';
@State Height: string = '100%';
@State isShowAlbum: boolean = false;
@State fontColor: string = '#182431222'
@State selectedFontColor: string = '#007DFF'
@State currentIndex: number = 0
private controller: TabsController = new TabsController();
albumOptions = new AlbumPickerOptions();
albumOptions1 = new AlbumPickerOptions();
albumOptions2 = new AlbumPickerOptions();

/**
*相册被选中回调,返回相册信息
* AlbumInfo(uri)
*/
private onAlbumClick(albumInfo: AlbumInfo): boolean {
this.isShowAlbum = false;
if (albumInfo?.uri) {
// 根据相册url更新宫格页内容。
this.pickerController.setData(DataType.SET_ALBUM_URI, albumInfo.uri);
}
return true;
}

aboutToAppear() {
/**
* 设置相册页颜色模式, 默认AUTO。
* AUTO:跟随系统的模式, LIGHT:浅色模式, DARK:深色模式
*/
this.albumOptions.themeColorMode = PickerColorMode.AUTO;
this.albumOptions1.themeColorMode = PickerColorMode.LIGHT;
this.albumOptions2.themeColorMode = PickerColorMode.DARK;
}

// 设置导航栏的样式
@Builder
tabBuilder(index: number, name: string) {
Column() {
Text(name)
.fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
.fontSize(16)
.fontWeight(this.currentIndex === index ? 500 : 400)
.lineHeight(22)
.margin({ top: 17, bottom: 7 })
Divider()
.strokeWidth(2)
.color('#007DFF')
.opacity(this.currentIndex === index ? 1 : 0)
}.width('100%')
}

build() {
Stack() {
Column() {
Row() {
Button("全部相册").width('95%').height('5%').onClick(() => {
this.isShowAlbum = true;
})
}.margin({ top: 40 })
Column() {
PhotoPickerComponent({
pickerController: this.pickerController,
}).height(this.Height).width(this.Width)
}.width('100%').height('100%').alignItems(HorizontalAlign.Center).visibility(this.isShowAlbum ? Visibility.None: Visibility.Visible)
}

if (this.isShowAlbum) {
Row() {
Column() {
/**
* 使用3个组件,以便更好展示不同效果。
* 需要注意的是切换tab会导致AlbumPickerComponent覆盖在PhotoPickerComponent上导致点击事件失效,
* 设置PhotoPickerComponent不可见可以规避点击失效。
*/
Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
TabContent() {
AlbumPickerComponent({
albumPickerOptions: this.albumOptions,
onAlbumClick: (albumInfo: AlbumInfo): boolean => this.onAlbumClick(albumInfo),
}).height('100%').width('100%')
}.tabBar(this.tabBuilder(0, '系统'))
TabContent() {
AlbumPickerComponent({
albumPickerOptions: this.albumOptions1,
onAlbumClick: (albumInfo: AlbumInfo): boolean => this.onAlbumClick(albumInfo),
}).height('100%').width('100%')
}.tabBar(this.tabBuilder(1, '浅色'))

TabContent() {
AlbumPickerComponent({
albumPickerOptions: this.albumOptions2,
onAlbumClick: (albumInfo: AlbumInfo): boolean => this.onAlbumClick(albumInfo),
}).height('100%').width('100%')
}.tabBar(this.tabBuilder(2, '深色'))
}
.vertical(false)
.barMode(BarMode.Fixed)
.barWidth('100%')
.barHeight(56)
.animationDuration(100)
.onChange((index: number) => {
this.currentIndex = index;
})
.width('100%')
.height('100%')
.backgroundColor('#F1F3F5')
}.width('100%').height('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
}
.margin({ top: 40 })
}
}
}
}