25. 目录浏览

鉴于目录浏览功能较为复杂。独立出来说明;

函数名

参数

返回值

作用说明

addFileObserver

FileObserver: FileObserver

void

注册目录浏览观察者

removeFileObserver

FileObserver: FileObserver

void

注销目录浏览观察者

setPageSize

int: 每次浏览文件个数,范围:[1, 30]

void

设置每次浏览文件个数

getPageSize

void

int: 每次浏览文件个数

获取每次浏览文件个数

getOnlineStorage

FileStruct: FileStruct

SDCardBean: SDCardBean

获取在线存储器

getCurrentReadFile

SDCardBean: SDCardBean

Folder: Folder

获取当前浏览目录

getCurrentFileStructs

SDCardBean: SDCardBean

List<FileStruct>: 子文件列表

读取当前目录下的已加载文件

isReading

void

boolean: 是否正在读取文件

是否正在读取文件

isOnline

int: 存储器索引号

boolean: 是否在线

存储器是否在线

gets

void

List<>: 存储器列表

获取存储器信息列表

getOnlineDev

void

List<>: 在线存储器列表

获取在线存储器列表

listFiles

Folder: Folder
int: 起始偏移

int: 操作结果码

目录浏览

listFiles

Folder: Folder
int: 起始偏移
boolean: 是否通知结果

int: 操作结果码

目录浏览

loadMore

SDCardBean: SDCardBean

int: 操作结果码

加载更多文件信息

appenBrowse

FileStruct: FileStruct
SDCardBean: SDCardBean

int: 操作结果码

浏览下一级目录

appenBrowse

Folder: Folder

int: 操作结果码

浏览下一级目录

backBrowse

SDCardBean: SDCardBean

int: 操作结果码

返回上一级目录(有回调)

backBrowse

SDCardBean: SDCardBean
boolean: 是否回调文件数据

int: 操作结果码

返回上一级目录

deleteFile

SDCardBean: SDCardBean
List<FileStruct>: 删除文件列表
DeleteCallback: 删除文件回调

int: 操作结果码

删除文件

deleteFile

SDCardBean: SDCardBean
List<FileStruct>: 删除文件列表
boolean: 是否需要准备环境
DeleteCallback: 删除文件回调

int: 操作结果码

删除文件

deleteFile

List<FileStruct>: 删除文件列表
boolean: 是否需要准备环境
DeleteCallback: 删除文件回调

int: 操作结果码

删除文件

playFile

FileStruct: FileStruct
SDCardBean: SDCardBean

int: 操作结果码

播放音乐文件

playFile

RegFile: RegFile

int: 操作结果码

播放音乐文件

formatDevice

SDCardBean: SDCardBean
OperatCallback: 操作回调

int: 操作结果码

格式化存储器

cleanCache

void

void

清除所有缓存

cleanCache

BluetoothDevice: 蓝牙设备

void

清除指定设备的所有缓存

cleanCache

SDCardBean: SDCardBean

void

清除指定存储器的所有缓存

25.1. 数据说明

25.1.1. 操作结果码

名称

码值

描述

FileBrowseConstant#SUCCESS

0(0x0000)

成功结果

FileBrowseConstant#ERR_PARAM

4096(0x1001)

无效参数

FileBrowseConstant#ERR_BUSY

8200(0x2008)

系统繁忙

FileBrowseConstant#ERR_OPERATION_TIMEOUT

12304(0x3010)

操作超时

FileBrowseConstant#ERR_READING

12305(0x3011)

正在目录浏览

FileBrowseConstant#ERR_OFFLINE

12306(0x3012)

存储器下线

FileBrowseConstant#ERR_LOAD_FINISHED

24576(0x6000)

文件列表已加载完毕

FileBrowseConstant#ERR_BEYOND_MAX_DEPTH

24577(0x6001)

超过限制目录层级

FileBrowseConstant#ERR_NO_DATA

24578(0x6002)

丢失文件数据

FileBrowseConstant#ERR_FILE_NOT_IN_STORAGE

24579(0x6003)

文件结构与存储器不一致
说明输入参数冲突

25.1.2. FileObserver

目录浏览观察者

public interface FileObserver {

     /**
      * 收到目录文件数据后回调
      *
      * @param fileStructs 文件结构列表
      */
     void onFileReceiver(List<FileStruct> fileStructs);

     /**
      * 一次文件读取结束
      *
      * @param isEnd 是否结束
      */
     void onFileReadStop(boolean isEnd);

     /**
      * 文件读取开始
      */
     void onFileReadStart();

     /**
      * 文件读取失败
      *
      * @param reason 错误码
      */
     void onFileReadFailed(int reason);

     /**
      * 设备的存储设备状态变化
      *
      * @param onLineCards 在线设备列表
      */
     void onSdCardStatusChange(List<> onLineCards);

     /**
      * 文件点播成功回调
      */
     void OnFlayCallback(boolean success);

 }

Note

  1. 文件结构, FileStruct

  2. 存储器信息, SDCardBean

25.1.3. FileStruct

文件结构

public class FileStruct implements IDataOp, Parcelable {

     /**
      * 是否文件
      *
      * <p>结果说明:
      * true -- 文件
      * false -- 文件夹</p>
      */
     private boolean file;
     /**
      * 是否Unicode编码
      *
      * <p>
      * 结果说明:
      * true -- Unicode编码
      * false -- ASCII编码
      * </p>
      */
     private boolean unicode;
     /**
      * 簇号。唯一标识
      */
     private int cluster = 0;
     /**
      * 文件夹序号
      */
     private short fileNum = 1;
     /**
      * 文件名
      */
     private String name = "";
     /**
      * 存储器类型
      */
     private byte devIndex;
}

25.1.4. SDCardBean

存储器信息

public class SDCardBean implements Parcelable {

 /**
  * SD卡类型
  */
 public static final int SD = 0;
 /**
  * USB类型
  */
 public static final int USB = 1;
 /**
  * Flash类型
  */
 public static final int FLASH = 2;
 /**
  * LineIn类型
  */
 public static final int LINEIN = 3;
 /**
  * Flash2类型
  */
 public static final int FLASH_2 = 4;

 //index
 /**
  * USB索引
  */
 public static final int INDEX_USB = 0;
 /**
  * SD0索引
  */
 public static final int INDEX_SD0 = 1;
 /**
  * SD1类型
  */
 public static final int INDEX_SD1 = 2;
 /**
  * Flash索引
  */
 public static final int INDEX_FLASH = 3;
 /**
  * 输入设备索引
  */
 public static final int INDEX_LINE_IN = 4;
 /**
  * Flash2索引
  */
 public static final int INDEX_FLASH2 = 5;


 /**
  * 存储器索引
  */
 private int index;
 /**
  * 存储器类型
  */
 private int type;
 /**
  * 存储器名称
  */
 private String name;
 /**
  * 存储器句柄
  */
 private int devHandler = -1;
 /**
  * 是否在线
  */
 private boolean online;
 /**
  * 操作设备
  */
 private BluetoothDevice device;
}

25.1.5. Folder

文件夹

public class Folder extends File {
  /**
   * 文件列表
   */
  private final transient List<File> files = new ArrayList<>();
  /**
   * 是否加载完成
   */
  private boolean isLoadFinish = false;
}

25.1.6. RegFile

资源文件

public class RegFile extends File {

}

public abstract class File extends FileStruct {

 /**
  * 父类文件夹
  */
 private transient final Folder parent;
 /**
  * 目录层级
  */
 private final int level;
}

25.2. 目录浏览

FileObserver fileObserver = new FileObserver() {
    @Override
    public void onFileReceiver(List<FileStruct> fileStructs) {
        // 读取到文件列表,仅仅回调本次读取的文件列表
    }

    @Override
    public void onFileReadStop(boolean isEnd) {
        // 文件列表读取结束
    }

    @Override
    public void onFileReadStart() {
        // 开始文件列表读取
    }

    @Override
    public void onFileReadFailed(int reason) {
        // 文件列表读取失败
    }

    @Override
    public void onSdCardStatusChange(List<> onLineCards) {
        //在线设备有变化
    }

    @Override
    public void OnFlayCallback(boolean success) {
        //歌曲点播回调
    }
};
//第一步:注册观察者

// 第2步:获取在线设备列表,可以通过fileObserver处理设备状态变化
FileBrowseManager.getInstance().addFileObserver(fileObserver);

// 第3步:读取当前设备正在读的当前目录
List<> list = FileBrowseManager.getInstance().getOnlineDev();
if(list.size()<1){
    //没有在线设备
    return;
}
  = list.get(0);//获取设备,如果有多个设备,请根据需求获取相应的设备
Folder currentFolder = FileBrowseManager.getInstance().getCurrentReadFile();

//第4步:获取当前目录下已经读了但在缓存中的子文件
List<FileStruct> fileStructs = currentFolder.getChildFileStructs();

//第5步:浏览操作
//加载更多
FileBrowseManager.getInstance().loadMore();
//进入下一级目录
FileStruct fileStruct = currentFolder.getChildFileStructs().get(0);//根据需要获取需要读取的文件夹
FileBrowseManager.getInstance().appenBrowse(fileStruct, );
//返回上一级目录没有列表回调
boolean hasEvent = true;//是否需要FileObserver的事件回调
FileBrowseManager.getInstance().backBrowse(,hasEvent);
//点播文件
FileBrowseManager.getInstance().playFile(fileStruct, );

25.3. 文件删除

List<> list = FileBrowseManager.getInstance().getOnlineDev();
if(list.size() < 1){
    //没有在线设备
    return;
}
  = list.get(0);//获取设备,如果有多个设备,请根据需求获取相应的设备
List<FileStruct> fileStructs = new ArrayList<>();//注意fileStructs一定要是在中
boolean withEnv = false;//准备环境,一般使用false
FileBrowseManager.getInstance().deleteFile(, fileStructs,withEnv, new DeleteCallback() {
    @Override
    public void onSuccess(FileStruct fileStruct) {
        //成功
    }

    @Override
    public void onError(int code, FileStruct fileStruct) {
        //fileStruct 删除失败
    }

    @Override
    public void onFinish() {
        //删除结束,通过onError判断是否有删除失败的文件
    }
});

25.4. 格式化

 //格式化,仅仅格式化设备
    List<> list = FileBrowseManager.getInstance().getOnlineDev();
if (list.size() < 1) {
    //没有在线设备
    return;
}
  = list.get(0);//获取设备,如果有多个设备,请根据需求获取相应的设备
FileBrowseManager.getInstance().formatDevice(, new OperatCallback() {
    @Override
    public void onSuccess() {
        //成功
    }

    @Override
    public void onError(int code) {
        //失败
    }
});

Warning

需要和固件工程师沟通,是否支持

25.5. 注意事项

Important

  1. 格式化操作请和固件确认是否需要备份或者准备环境

  2. 删除文件操作请和固件确认是否需要备份或者准备环境