手记

Android10.0 外部存储权限问题

权限问题

    以往配置的权限为:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>写的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>SDCard的权限

运行在Android10.0的设备的时候会出现权限被拒绝的问题,导致文件没有办法新建和写入。

在网上搜了很多解决办法,也在问答区看到很多大佬的说法,总结出来:

1)动态申请权限:

//ContextCompat.checkSelfPermission会返回一个int类型数值
//参数1:环境上下文
//参数2:权限常量名
int i = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//如果权限没有被赋予则动态申请权限
if (i != PackageManager.PERMISSION_GRANTED) {
    //动态申请权限
    //参数1:上下文
    //参数2:权限常量名,在Manifest下
    //参数3:requestCode
    ActivityCompat.requestPermissions(
            this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            1);
}

2)使用getExternalFileDir()获取文件路径:

因为安卓10只能在系统分配的固定文件夹中新建目录和文件

String path = this.getExternalFilesDir(null).getAbsolutePath() + "123.txt";

控制台打印的路径:

 E/TAG: /storage/emulated/0/Android/data/com.example.neibucuncuapplication/files123.txt


而使用Environment.getExternalStorageDirectory获取的路径则是

E/TAG: /storage/emulated/0/123.txt

Environment.getExternalStorageDirectory().getAbsolutePath()+"/123.txt";

3)正常完成保存和读取操作:

switch (view.getId()) {
    //保存按钮点击事件:
    case R.id.btn_save:
        //根据绝对路径新建文件
        File file = new File(path);
        //判断该文件是否已经存在
        //如果不存在 取反
        if (!file.exists()) {
            //则新建这个文件
            file.createNewFile();
        }
        //创建文件输出流
        //参数1:路径 参数2:是否追加
        FileOutputStream fos = new FileOutputStream(path,true);
        //文件输出流用字节方式写入输入框内的数据
        fos.write(mEdit.getText().toString().getBytes());
        //点击保存后清空输入框里的内容
        mEdit.setText("");
        //关闭文件输出流
        fos.close();
        break;
    //读取按钮点击事件:
    case R.id.btn_read:
        //创建文件输入流 参数:路径
        FileInputStream fis = new FileInputStream(path);
        //创建字节数组 长度1024
        byte[] bytes = new byte[1024];
        //文件输入流读取到的长度就是字节数组的长度
        int len = fis.read(bytes);
        //newString 参数1:字节数组 参数2:0,参数3:实际读到的长度
        String str=new String(bytes,0,len);
        //把读到的字节转换成String类型的
        //把文本控件内容设置为读到的字符串
        mTextView.setText(str);
        //关闭文件输出流
        fis.close();
        break;
}

0人推荐
随时随地看视频
慕课网APP