文章目录

  • 一、原理
    • 1.目标
    • 2.要求
    • 3.思路
  • 二、过程
  • 三、结果
  • 四、过程中存在的问题及解决方案
  • 五、源代码
    • 1、布局文件代码
    • 2、程序文件
    • 3、配置文件

一、原理

1.目标

        Andriod系统文件访问

2.要求

设计Android文件浏览器,以列表形式展示系统中存储的文件,排序规则为:文件夹在前面,文件在后面,如果同为文件夹或文件,则按字母顺序排列。文件夹和文件显示不同的图标,单击文件夹,可以进入下级目录并展示。应用顶部显示当前所在目录。

3.思路

主页首先获取系统外部存储的根目录,然后通过listview 控件列表展示。当单击某个文件夹时,获取单击文件夹的文件路径,通过listFiles()方法获取该路径下的子文件,并根据自定义的比较器对结果进行排序,然后更新listview的数据,刷新显示。需要建立4个java文件和3个xml文件供实验操作使用。并修改AndroidManifest.xml文件。

二、过程

开始,在MainActivity中,首先根据Environment.getExternalStorageState(方法判断外部存储是否可用,如果可用,获取外部存储的根目录,然后调用文件管理类FileMgr 的方法获取子文件列表,将文件列表设置到listView自定义的Adapter 中。在onCreate(方法中,对listview的item设置了单击的监听事件,当item被单击后,获取对应的文件对象。如果该文件属于文件夹,则获取子目录,并调用Adapter的noifyDataSetChanged(方法刷新页面显示。其中自定义Adapter和文件管理类的代码如下。
接着,在FileMgr中,调用了File 原生的listFiles()方法获取文件的子文件集合,只不过通过文件名对隐藏文件做了过滤。在返回结果之前,使用自定义的Comparator对文件集合做了排序。
需要在下图中加入两个图片,分别为文件和文件夹:

三、结果

运行结果如下:

点击任意一个可查看下级文件:点击第二个之后

再次点击后:

四、过程中存在的问题及解决方案

问题:

  • 直运行停止,APP不响应.
  • 无法进入下一级目录,点击后无反应

解决方案:

  • 之前用的8.0,改成这个4.0.3之后一样的代码就可以运行了(我的就可以了)。
  • 一直感觉是代码语句的原因,仔细一看还真是!!!将下列第一张图片红框中语句改为第二张图片中红框中的代码即可解决。

五、源代码

1、布局文件代码

设置listview并显示文件路径:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/txt_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:text="TextView" /><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="5dp"android:divider="#d9d9d9"android:dividerHeight="1dp"android:layout_below="@+id/txt_view"></ListView></RelativeLayout>

设置文件及名称再item中显示的样式:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical"><ImageViewandroid:id="@+id/item_iv"android:layout_width="48dp"android:layout_height="48dp"android:layout_margin="8dp"android:background="@drawable/folder" /><TextViewandroid:id="@+id/item_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是ListView的Item布局"android:textColor="@color/colorAccent"android:textSize="18sp" />
</LinearLayout>

2、程序文件

MainActivity.java:

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.util.List;public class  MainActivity extends AppCompatActivity {private ListViewAdapter mAdpter;private TextView mTitle;private FileMgr fileMgr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act_1);//用于显示当前文件的路径mTitle=(TextView)findViewById(R.id.txt_view);//获取listview控件ListView listView=(ListView)findViewById(R.id.lv);//自定义的AdaptermAdpter=new ListViewAdapter(this);init();listView.setAdapter(mAdpter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int pos, long id) {//获取当前单击的文件File file = mAdpter.getItem(pos);//更新显示下级目录change(file);}});}private void init(){fileMgr=new FileMgr();//判断外部存储是否可用if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){Toast.makeText(this,"the external storage is not avalible",Toast.LENGTH_SHORT).show();return;}File rootFile=Environment.getExternalStorageDirectory();mTitle.setText(rootFile.getAbsolutePath());//获取当前目录的子列表List<File>files=fileMgr.getSubFiles(rootFile);mAdpter.updateFiles(files);}private void change(File file){if(file.isFile())//如果不是文件夹,直接返回{return;}//更新路径的显示mTitle.setText(file.getAbsolutePath());//获取新的文件列表List<File>files=fileMgr.getSubFiles(file);//更新文件和视图显示mAdpter.updateFiles(files);mAdpter.notifyDataSetChanged();}
}

ListViewAdapter.java:

package com.example.myapplication;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class ListViewAdapter extends BaseAdapter {private LayoutInflater flater;private List<File> mDatas;public ListViewAdapter(Context context){flater=LayoutInflater.from(context);mDatas=new ArrayList<File>();}public void updateFiles(List<File>files){mDatas.clear();mDatas.addAll(files);}public int getCount(){return (null==mDatas|| mDatas.isEmpty())?0:mDatas.size();}@Overridepublic File getItem(int pos){if(null!=mDatas&&pos<mDatas.size()){return mDatas.get(pos);}return null;}@Overridepublic long getItemId(int position){return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){if(null==convertView){//为每一个子项加载布局convertView=flater.inflate(R.layout.list_item,null);}//获取字item布局文件的控件ImageView imgView=(ImageView)convertView.findViewById(R.id.item_iv);TextView txtTitle=(TextView)convertView.findViewById(R.id.item_tv);File file=getItem(position);//根据position获取数据if (null!=file){imgView.setImageResource(file.isDirectory()?R.drawable.folder:R.drawable.file);txtTitle.setText(file.getName());}return convertView;}
}

FileMgr.java

package com.example.myapplication;import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class FileMgr {public List<File> getSubFiles(File file){File[] files=file.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File f, String name) {return !name.startsWith(".");}});System.out.println("files:"+(null==files));if(null!=files){System.out.println("file mgr length:"+files.length);}List<File> result= Arrays.asList(files);Collections.sort(result,new CustomFileComparator());return result;}
}

CustomFileComparator.java

package com.example.myapplication;import java.io.File;
import java.util.Comparator;public class CustomFileComparator implements Comparator {@Overridepublic int compare(Object o1,Object o2){File file1=(File)o1;File file2=(File)o2;int compare = file1.getName().compareTo(file2.getName());if (file1.isDirectory()){if (file2.isFile()){return -1;}return compare;}if (file2.isDirectory()){return 1;}return compare;}
}

3、配置文件

需要添加代码:

<manifest …………xmlns:tools="http://schemas.android.com/tools"…………><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"tools:ignore="ProtectedPermissions"/></manifest>

一秒钟实现Andriod系统文件访问相关推荐

  1. 计算机连共享盘被禁止用户,共享文件夹无法访问、设置文件夹访问权限、共享文件夹拒绝访问的解决方法...

    在开启共享文件的局域网中,经常出现共享文件无法访问.共享文件夹拒绝访问的问题,导致大家使用共享文件受到限制,影响工作的开展.这一方面是Windows操作系统自身的共享文件访问功能设计缺陷,另一方面也由 ...

  2. Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)

    先吐槽一下:太难了!为什么要让一个菜鸡做这种事情? 一.业务需求 业务需求是这样的: 前端上传到服务器指定文件夹中一些视频文件,使用流媒体播放 但是无法访问,原因是权限不足 可以通过命令修改文件夹的权 ...

  3. 【Java秒杀方案】11.功能开发-【商品秒杀及优化】防止超卖 接口优化(redis预减库存,内存标记减少redis访问,RabbitMQ异步下单) 安全优化(隐藏秒杀接口,验证码,接口防刷)

    商品秒杀核心功能及优化 1. 正常秒杀流程 在商品详情页面等待秒杀倒计时–http://localhost:8080/goodsDetail.htm?goodsId=2 倒计时为0,开始秒杀,点[秒杀 ...

  4. HDFS Namenode启动过程

    Namenode保存文件系统元数据镜像,namenode在内存及磁盘(fsimage和editslog)上分别存在一份元数据镜像文件,内存中元数据镜像保证了hdfs文件系统文件访问效率,磁盘上的元数据 ...

  5. android手机界面管理系统的设计与实现(硕士学位论文).pdf,基于Android系统的手机文件管理器的设计与实现...

    摘要: 在移动终端技术不断发展的今天,智能手机支持的业务也越来越丰富,已经从简单的通话工具发展成为集PDA,互动游戏,高分辨率摄像,移动视听于一体的全功能通讯,数据处理工具,其操作系统平台也从最初的L ...

  6. TCP/IP详解--第九章

     第9章 IP选路 9.1   引言 选路是 IP最重要的功能之一.图 9-1是IP层处理过程的简单流程.需要进行选路的数据报 可以由本地主机产生,也可以由其他主机产生.在后一种情况下,主机必须配置成 ...

  7. 安全 日志挖掘 分析系统数据源

    日志数据源主要包括系统日志.WEB日志.路由器日志等日志,其中,日志类型主要包括以下几个种: secure 日志 /var/log/secure,该日志记录了系统每天发生的各种各样的事情,包括那些用户 ...

  8. Redis常用命令集

    Redis常用命令集 1)连接操作命令 quit:关闭连接(connection) auth:简单密码认证 help cmd: 查看cmd帮助,例如:help quit 2)持久化 save:将数据同 ...

  9. Memcache缓存系统原理

    在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法.其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率. 除了能够提高服务的运行效 ...

最新文章

  1. 《统一沟通-微软-实战》-3-部署-Exchange 2010-4-基本配置
  2. python函数图像加标签_tkinter(py3)更改图像标签,函数内部,实时
  3. 【Python】青少年蓝桥杯_每日一题_11.03_按要求输出两个正整数之间的数
  4. Kubernetes数据持久化方案
  5. 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距
  6. C++中如何去掉std::string对象的首尾空格
  7. Intel PAUSE指令变化影响到MySQL的性能,该如何解决?
  8. linux shell 0403-011,shell脚本出现 test:0403-004 Specify a paramater with this command
  9. python识别验证码——PIL,pytesser,pytesseract的安装
  10. 特斯拉上调电动汽车预订订金:由100美元上调至250美元
  11. vmware下ubuntu 鼠标不起作用解决方法
  12. AGG第四十二课 Blitting an image over another with transparency
  13. 微软ASP.NET站点部署指南(11):部署SQL Server数据库更新
  14. Redis 菜鸟教程学习笔记- Redis 配置
  15. URL和URI的区别
  16. 样本标准差分母为什么是n-1
  17. 交换机路由器常用命令大全
  18. macOS开发中用TagLib获取、修改音频文件信息
  19. 完全平方公式、平方差公式、一个数负次方
  20. ue4 项目模板_Unreal 学习和使用UE4的第二步——创建项目和模板试玩 - 游戏编程 ️...

热门文章

  1. 二.linux应用网络编程之文件属性
  2. PDF分割合并工具 免费,绿色软件
  3. 美团商家的数据指标体系是怎么做的?
  4. 刷新率属于计算机的显示性能指标吗,显示器性能指标(菜鸟必看)
  5. pandorabox php,Openwrt Pandorabox 挂载摄像头 定时拍照上传百度网盘,实现实时监控(优酷路由宝)...
  6. Sketch 在 mac 运行缓慢怎么办?丨使用教程
  7. python绘制动漫人物图片女生可爱_日本动漫人物图片女生可爱图片大全
  8. Geom error原因以及解决办法
  9. 7天入门数据库 day23 - 数据表的CURD
  10. 基于SSM校园学术报告管理平台毕业设计文案及源码