Java提供了一套完整的IO流体系,包括FileInputStream、FileOutPutStream等,通过这些IO流可以非常方便的访问磁盘上的文件内容。Android同样支持以这种方式来访问手机存储器上的文件。
AndroidManifest.xml中manifest标签下有一个属性android:installLocation
,用于指定应用程序安装在什么地方,该属性有三个可选值:
获取External存储的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Context提供了两个方法打开应用程序的数据文件夹里的文件IO流:
Context还提供了访问应用程序的数据文件夹的方法:
为了更好的存取应用程序的大文件数据,应用程序需要读写SD卡上的文件。
读写SD卡上文件的步骤:
//如果返回true,说明已插入SD卡,且应用程序具有读写SD卡的能力
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
为了读写SD卡上的数据,必须在AndroidManifest.xml中添加读写SD卡的权限:
<!-- 在SD卡中创建于删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡中写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
资源文件夹,在main下与res同级,与res不同的是,该目录下的资源文件在打包apk时,会按原格式一并被打包。
有三种使用方法:
webView.loadUrl("file:///android_asset/test.html");//假设已经创建了一个WebView实例```
//这里的open只能打开文件,不能打开文件夹 InputStream inputStream = getResource().getAssets().open("test.html");
- 读取列表、读取图片、读音乐,assets目录下包含一个images目录和一个mp3文件xuwei.mp3,images目录中包含一张图片dog.jpg:
String[] fileNames = getAssets().list("images/");//读列表
InputStream inputStream = getAssets().open("images/dog.jpg");//读图片 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imageView.setImageBitmap(bitmap);
AssetFileDescriptor assetFileDescriptor = getAssets().openFd("xuwei.mp3");//得到asset文件描述符 player.reset();//假设已创建一个MediaPlayer实例 player.setDataResource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); player.prepare(); player.start();
### 2.raw
资源文件夹,在res目录下,系统会为res目录下的所有资源生成相应的资源ID,raw中的文件也不例外,所以可以通过ID去访问res/raw目录中的任何文件,而assets目录中的文件就需要借助AssetManager去访问了。
assets目录允许下面有多级子目录,而res/raw下不允许存在目录结构。
读raw下的xuwei.mp3文件:
InputStream is = getResources().openRawResource(R.raw.xuwei);
### 3.res
res目录下的文件都可用getResources()方法读取。
# 五.SD卡文件浏览器
***
利用Java的File类开发一个SD卡文件浏览器,通过Environment.getExternalStorageDirectory()访问系统的SD卡目录,然后通过File的listFiles()方法获取指定目录下的全部文件和文件夹。
布局文件如下:
activity_main.xml
```xml
<?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="com.trampcr.sdfileexplorer.MainActivity">
<TextView
android:id="@+id/path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:gravity="center_horizontal" />
<ListView
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/path" />
<Button
android:id="@+id/parent"
android:layout_width="38dp"
android:layout_height="34dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:background="@drawable/home" />
</RelativeLayout>
布局文件包含一个TextView用于显示当前路径,ListView显示当前目录下文件和文件夹,Button用于返回上一级目录。
ListView中的子布局,包含一个ImageView和一个TextView:
line.xml:
<?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="50dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/folder"/>
<TextView
android:id="@+id/file_name"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="abc"/>
</LinearLayout>
主程序代码如下:
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private TextView mTextView;
//记录当前的父文件夹
private File mCurrentParent;
//记录当前路径下的所有文件的文件数组
File[] mCurrentFiles;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list);
mTextView = (TextView) findViewById(R.id.path);
//获取系统的SD卡的目录
File root = new File(String.valueOf(Environment.getExternalStorageDirectory()));
//如果SD卡存在
if (root.exists()){
mCurrentParent = root;
mCurrentFiles = root.listFiles();
//使用当前目录下的全部文件、文件夹来填充ListView
inflateListView(mCurrentFiles);
}
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mCurrentFiles[position].isFile()){
return;
}
File[] tmp = mCurrentFiles[position].listFiles();
if (tmp == null || tmp.length == 0){
Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件", Toast.LENGTH_SHORT).show();
}else {
mCurrentParent = mCurrentFiles[position];
mCurrentFiles = tmp;
inflateListView(mCurrentFiles);
}
}
});
//获取上一级目录的按钮
Button parent = (Button) findViewById(R.id.parent);
parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (!mCurrentParent.getCanonicalFile().equals("/mnt/shell/emulated/0")){
mCurrentParent = mCurrentParent.getParentFile();
mCurrentFiles = mCurrentParent.listFiles();
inflateListView(mCurrentFiles);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void inflateListView(File[] files) {
//创建一个List集合,List集合的元素是Map
List<Map<String, Object>> listItems = new ArrayList<>();
for (int i = 0; i < files.length; i++) {
Map<String, Object> listItem = new HashMap<>();
if (files[i].isDirectory()){
listItem.put("icon", R.drawable.folder);
}else {
listItem.put("icon", R.drawable.file);
}
listItem.put("fileName", files[i].getName());
listItems.add(listItem);
}
//创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line, new String[]{"icon", "fileName"}, new int[]{R.id.icon, R.id.file_name});
mListView.setAdapter(simpleAdapter);
try {
mTextView.setText("当前路径为:" + mCurrentParent.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用File[]数组填充ListView,填充是程序会根据File[]数组里的数据元素代表的是文件还是文件夹来选择使用文件图标或文件夹图标。
运行上面程序,可以看到:
SDExplorer.png
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有