权限问题
以往配置的权限为:
<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; }