Android10.0 外部存儲權(quán)限問題
权限问题
以往配置的权限为:
<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;
}點擊查看更多內(nèi)容
為 TA 點贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
