快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
转 https://www.jb51.net/article/144939.htm

对Android的SD卡进行读取权限设置时:
|
1
2
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
结果报错:

依然提示我没有权限,于是百度说是版本问题,23.0版本(笔者的版本是25.0)以上的不仅仅要设置上面的权限,还要在对SD卡有读写操作的地方授权,下面是公共类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class PermisionUtils { // Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; /** * Checks if the app has permission to write to device storage * If the app does not has permission then the user will be prompted to * grant permissions * * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } }} |
然后直接在需要授权的地方调用:
|
1
2
|
//检测读写权限PermisionUtils.verifyStoragePermissions(this); |
程序运行的时候,会询问是否授权

点击授权即可。
以上这篇快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考
本人练习一个例子源码:
package com.example.datastrorage; import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import java.io.File;
import java.io.FileInputStream; import java.io.FileOutputStream;
import java.io.IOException; public class FileActivity extends AppCompatActivity {
private EditText mEtData;
private Button mBtSave;
private TextView mTvShow;
private Button mBtShow;
final String mFilename="data.txt"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
mEtData = findViewById(R.id.et_file_data);
mBtSave = findViewById(R.id.bt_file_save);
mTvShow = findViewById(R.id.tv_file_show);
mBtShow = findViewById(R.id.bt_file_show); mBtSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveData(mEtData.getText().toString());
} });
mBtShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { mTvShow.setText(readData(mFilename));
} }); //检测读写权限
PermisionUtils.verifyStoragePermissions(this);
} //保存数据
private void saveData(String data){
FileOutputStream fileOutputStream = null;
try {
//内部文件访问
//fileOutputStream = openFileOutput(mFilename, MODE_PRIVATE);
//外部文件访问
File dir=new File(Environment.getExternalStorageDirectory(),"save");
if(!dir.exists()){
dir.mkdirs();
}
File file=new File(dir,mFilename);
if(!file.exists()){
file.createNewFile();
}
fileOutputStream = new FileOutputStream(file);
//end-外部文件访问
fileOutputStream.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
} }
} }
//读取数据
private String readData(String mFilename){ String data=""; FileInputStream fileInputStream = null; try {
//内部文件访问
//fileInputStream = openFileInput(mFilename);
//外部文件访问
String path="";
path=Environment.getExternalStorageDirectory().getAbsolutePath();
Log.d("FileActivity",path);
File file=new File(path+File.separator+"save",mFilename);
fileInputStream = new FileInputStream(file);
//end-外部文件访问
byte[] buf = new byte[1024];
int len;
StringBuilder sb = new StringBuilder("");
while ((len = fileInputStream.read(buf)) > 0) {
sb.append(new String(buf,0,len));
} data=sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
} }
} return data; }
}
其它参考例子:
快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题的更多相关文章
- 【译】如何在 Android 5.0 上获取 SD卡 的读写权限
因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...
- 对Android 8.0以上版本通知点击无效的一次分析
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...
- 转-Android 之 使用File类在SD卡中读取数据文件
如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码: <!-- 在sd中创建和删除文件的权限 --> ...
- 【Arcgis for android】保存地图截图到sd卡
关键词:arcgis for android ,截图,bitmap,sd卡 参考文章:http://blog.csdn.net/wozaifeiyang0/article/details/767972 ...
- Android—将Bitmap图片保存到SD卡目录下或者指定目录
直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...
- Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()
解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...
- Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程
博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...
- AppCompat v21 — Android 5.0之前版本设备的Material Design实现
博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...
- Android 9.0/P 版本推荐使用 HttpURLConnection
早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针 ...
随机推荐
- CentOS7 PHP增加连接Sqlserver扩展
扩展插件下载地址 https://github.com/Microsoft/msphpsql/tags 本机PHP版本7.2,非线程安全 https://github.com/microsoft/ms ...
- Image Processing and Analysis_8_Edge Detection:A Computational Approach to Edge Detection——1986
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- OpenCV视觉处理核心课程
OpenCV视觉处理核心课程 观看链接:https://www.bilibili.com/video/av29500928?from=search&seid=47008639320014639 ...
- 自己手写实现Dubbo
目录 dubbo 简单介绍 为什么手写实现一下bubbo? 什么是RPC? 接口抽象 服务端实现 注册中心 消费者端: dubbo 简单介绍 dubbo 是阿里巴巴开源的一款分布式rpc框架. 为什么 ...
- linux——系统命令
(1) 显示系统日期和时间:date 显示系统当前时间 例如:date (1) 切换用户:su 用户名 以其他用户身份使用系统,(类似windows10系统,有些程序以管理员身份执行) ① 从r ...
- Educational Codeforces Round 40 G. Castle Defense (二分+滑动数组+greedy)
G. Castle Defense time limit per test 1.5 seconds memory limit per test 256 megabytes input standard ...
- SSH环境搭建之Hibernate环境搭建篇
SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...
- faucet搭建(linux/win)
sudo apt-get install libssl-dev pip3 install flaskpip3 install flask_scriptpip3 install flask_sqlalc ...
- PHP把数组按指定的个数分隔
PHP把数组按指定的个数分隔 假设数组为array(‘1’,‘2’,‘3’,‘4’,‘5’,‘6’); 想把它分割成四个,那么结果为array(‘0’ => [‘1’,‘2’],‘1’ => ...
- SQL 递归查询,意淫CTE递归的执行步骤
今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...