概念
内存(emory)
内部存储(ternalStorage)
外部存储(ExternalStorage)
1)storage或者mnt文件夹下
2) 通过:
Environment.getExternalStorageDirectory()
可以看到外部存储的位置
3) 公有目录(DCIM、DOWNLOAD等),要使用需要申请权限。
4) 私有目录(Android/data/应用包名),只能被当前应用访问。
外部存储(ExternalStorage)的用法(写入):
1、获取外部存储的绝对路径,并在后面追加我们要创建的文件名称
String path= Environment.getExternalStorageDirectory().getAbsolutePath() +"/Mytest.txt";
2、创建一个文件
File file =new File(path);
如果该文件不存在则创建,已经存在则不创建:
try {
if (!file.exists()) {
file.createNewFile();
}
}catch (IOException e) {
e.printStackTrace();
}
3、创建 文件输出流
try {
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos=new FileOutputStream(path,true);
String str=infoEdt.getText().toString();
fos.write(str.getBytes());//以字节流的方式写入
}catch (IOException e) {
e.printStackTrace();
}
4、在AndroidManifest.xml中加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其中第二条权限可能会报错,这时候解决办法是:
在报错的地方添加
tools:ignore="ProtectedPermissions"
同时在manifest标签里添加;
xmlns:tools="http://schemas.android.com/tools"
外部存储(ExternalStorage)的用法(读取):
1、创建文件输入流。
FileInputStream fis =new FileInputStream(path);
2、因为FileInputStream是字节流,里面是一个个字节(写入的时候也是把String转换成字节写入的),所以需要定义一个字节数组来容纳读取出来的字节流。
byte[] b =new byte[1024];
int len = fis.read(b);//读取fis字节流,将其存储在字节数组b中,并返回数组的长度(字节的个数)
3、将字节数组转换成字符串,并显示在TextView中。
String str2=new String(b,0,len);
txt.setText(str2);
注意:1、从外部存储读取文件不需要权限
2、Android6.0以上对外部存储(内存卡)共有目录的读写需要运行时权限(允许访问内存卡),这个权限需要用户手动开启,只在AndroidManifest.xml中申请是没用的。
Android外部存储动态权限申请
int permissionContextCompet.checkSelfPermission(context,permission) 检查是否具有权限
第一个参数,环境上下文(this),第二个参数,权限名,Manifest.permission.WRITE_EXTERNAL_STORAGE,返回的是一个int类型的变量,将其与PackageManger.PERMISSION_GRANTED比较,等于则说明有权限,不等于的话则要动态申请权限:
if(permission!= PackageManager.PERMISSION_GRANTED){
//没有权限,则要申请权限
}
ActivityCompet.reaquestPermissions(activity,permission,code) 请求权限,第一个参数:activity 第二个参数:String类型的数组,里面装了各种权限,当有多项权限需要申请的时候可以一起申请,第三个参数:一个int类型的请求码,动态申请权限的时候会触发onRequestPermissionsResult()方法,如果在申请的过程中有什么需要做的操作可以定义在该方法中,第三个参数请求吗可以帮助知道是那个权限的申请触发了这个方法
int permission=ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1){
//当前没有什么要处理的
}
}
获取外部存储的目录(私有目录)
通过:Environment.getExternalStorageDirectory()获取到的是根目录,通过在后面拼接目录名称,可以访问到公有目录
要获取外部存储目录的私有目录,可以通过:
1)Context.getExternalFilesDir(String type)获取到SDCard/Android/data/包名/files/目录,这个目录下一般存放一些需要长时间保存的数据。这个参数是用于指定文件夹类型的(图片,音乐,视频...)。
2)Context。getExternalCacheDir()获取到SDCard/Android/data/包名/cache/目录,这个目录下面一般存放一些临时的缓存性的数据。