You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中DocumentFile.isDirectory()返回结果异常问题求助

DocumentFile.isDirectory() 误判文件为目录的问题解决

在使用DocumentFile实现内嵌文件浏览器时,出现isDirectory()将payload.bin、.tmp等文件错误识别为目录的情况,这是因为DocumentFile依赖文件的MIME类型判断目录属性,部分文件提供器会给特殊后缀或无明确类型的文件错误标记目录类型。

解决方案:结合文件名与MIME类型双重校验

修改RecyclerView适配器的onBindViewHolder方法,在判断目录时增加文件名后缀和MIME类型的辅助校验:

@Override
public void onBindViewHolder(@NonNull AddFilesAdapter.ViewHolder holder, int position) {
    DocumentFile file = files[position];
    holder.filename.setText(file.getName());
    String type = file.getType();
    holder.setFileIndex(position);

    // 修正目录判断逻辑:结合isDirectory()、MIME类型和文件名后缀
    boolean isActualDirectory = file.isDirectory();
    String fileName = file.getName();
    // 排除常见非目录文件的后缀(可根据需求扩展)
    if (isActualDirectory && !TextUtils.isEmpty(fileName)) {
        String[] fileExtensions = {".bin", ".tmp", ".log", ".txt", ".zip"};
        for (String ext : fileExtensions) {
            if (fileName.toLowerCase().endsWith(ext)) {
                isActualDirectory = false;
                break;
            }
        }
        // 额外校验MIME类型:如果类型不是目录,则强制修正
        if (!"vnd.android.document/directory".equals(type)) {
            isActualDirectory = false;
        }
    }

    if (isActualDirectory) {
        holder.icon.setImageResource(R.drawable.folder);
    } else {
        // 根据文件类型设置对应图标(示例)
        if (type != null && type.startsWith("image/")) {
            holder.icon.setImageResource(R.drawable.image_file);
        } else {
            holder.icon.setImageResource(R.drawable.generic_file);
        }
    }

    // 其他无关代码
}

补充说明

  • 部分文件提供器返回的元数据存在误差,isDirectory()并非完全可靠,需要辅助校验
  • 可根据业务需求扩展文件后缀列表,覆盖更多需要排除的文件类型
  • 如果需要更精准的判断,也可以通过ContentResolver查询文件的DocumentsContract.Document.COLUMN_MIME_TYPE字段,直接获取官方定义的MIME类型来判断

相关代码参考

ViewHolder实现

public static class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        icon = itemView.findViewById(R.id.IV_FileIcon);
        filename = itemView.findViewById(R.id.TV_FileName);
    }

    public void setFileIndex(int fileIndex) {
        this.fileIndex = fileIndex;
    }

    private int fileIndex;
    public ImageView icon;
    public TextView filename;
}

ImageView布局代码

<ImageView
    android:id="@+id/IV_FileIcon"
    android:layout_width="50dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginStart="12dp"
    tools:src="@drawable/folder" />

内容的提问来源于stack exchange,提问作者Ammar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:44:55