Android:纯按键式文件浏览器开发指南

作者:袖梨 2026-05-27
本文回顾了一个教育平板项目的文件浏览器开发过程,针对无触屏设备通过纯按键交互实现层级化资源管理。以下是关键实现要点和技术细节。 硬件:低端 TV 盒子/,配红外遥控器,无触屏设备 内容:TF 卡 /听力 目录下,按年级分文件夹,叶子节点是 .mp3 或自定义加密音频 核心诉求: 上下键循环选中(到顶再按上回到底部) 确定键进入文件夹或播放 返回键回到上级目录,且焦点停留在刚才进入的那个文件夹上(这是 TV 交互的硬需求) 文件过滤:隐藏系统目录,按年级名排序 1、定义变量 TextView title; //标题 RecyclerView recyclerView; //列表 UnitAdapter mUnitAdapter; //适配器 ArrayList unitList; //列表数据 LinearLayout ll_no_data; //无数据view boolean isNoData = false; //无数据标识String sDcardDir; //根目录名称 String cur_name; //当前目录名称 String cur_path; //当前目录路径 String last_title; //上次标题名称 int last_mPos = 0; //上次选择位置 int first_mPos = 0; //第一次点击位置String root_name = ""; //一级目录名称 String title_str = ""; 2、初始化和加载 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_list); title_str = getIntent().getStringExtra("title"); //传入的标题 title = findViewById(R.id.title); if (!TextUtils.isEmpty(title_str)) { root_name = title_str; } title.setText(root_name); sDcardDir = SDCardUtils.getTfStorageDirectory(this) + "/听力"; //根目录路径 recyclerView = findViewById(R.id.recyclerView); ll_no_data = findViewById(R.id.ll_no_data); title.setTextColor(getResources().getColor(R.color.col_1E2736)); unitList = new ArrayList(); mUnitAdapter = new UnitAdapter(this, new View.OnClickListener() { @Override public void onClick(View v) {// item点击 mUnitAdapter.mPosSomeTime = ((int) v.getTag()); Log.d("TAG", "((int) v.getTag()---> " + ((int) v.getTag())); mUnitAdapter.notifyDataSetChanged(); ClickSelect(); //选择目录或文件 } }); recyclerView.setAdapter(mUnitAdapter); verifyStoragePermissions(this); //权限请求 } /** * 获取tf卡根目录 * @param context * @return */ public static String getTfStorageDirectory(Context context) { String tfDir = null; StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); Class smc = sm.getClass(); try { Method getPaths = smc.getMethod("getVolumePaths", new Class[0]); String[] paths = (String[])getPaths.invoke(sm, new Object[]{}); if (paths.length >= 2) { tfDir = paths[1]; } } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return tfDir; }private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"}; //然后通过一个函数来申请 public static void verify

相关文章

精彩推荐