Android外部存储ExternalStorage

概念

内存(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/目录,这个目录下面一般存放一些临时的缓存性的数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容