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 |
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 |
int: 操作结果码 |
删除文件 |
|
deleteFile |
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
文件结构, FileStruct
存储器信息, 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
格式化操作请和固件确认是否需要备份或者准备环境
删除文件操作请和固件确认是否需要备份或者准备环境