快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

转 https://www.jb51.net/article/144939.htm

今天小编就为大家分享一篇快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

对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 4.4及以上版本写入外置SD卡问题

Android中使用SDcard进行文件的读取

Android7.0sdcard文件访问问题

Android 8.0 中如何读取内部和外部存储以及外置SDcard

快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题的更多相关文章

  1. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  2. 对Android 8.0以上版本通知点击无效的一次分析

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...

  3. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  4. 【Arcgis for android】保存地图截图到sd卡

    关键词:arcgis for android ,截图,bitmap,sd卡 参考文章:http://blog.csdn.net/wozaifeiyang0/article/details/767972 ...

  5. Android—将Bitmap图片保存到SD卡目录下或者指定目录

    直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...

  6. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...

  7. Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...

  8. AppCompat v21 — Android 5.0之前版本设备的Material Design实现

    博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...

  9. Android 9.0/P 版本推荐使用 HttpURLConnection

    早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针 ...

随机推荐

  1. Django restfulframework 开发相关知识 整理

    目录 目录 前言 前后端分离 实现前后端分离的方法 前后端分离带来的优点 RESTful十大规范 协议规范 域名规范 版本表示规范 url使用名词 http请求动词 过滤条件 状态码 错误信息 请求方 ...

  2. 【Java并发】基础

    一.概述 1.1 线程与进程区别 1.2 多线程引发的性能问题 二.多线程创建方式 2.1 第一种-继承Thread类 2.2 第二种-实现Runnable接口 2.3 第三种-实现Callable接 ...

  3. explicit和implicit

    explicit是C++中的一个关键字,只用于修饰只有一个参数的构造函数: class A{ explicit A(const T obj); }; 该关键字告诉编译器该类只能显式的转换,不能隐式(i ...

  4. 这些JVM命令配置参数你知道吗?

    JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器.然而,我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集.转动线程.打开和关闭文件.中断和/或JIT编译Java字节码 ...

  5. bat 获取当前目录的父目录

    bat 获取当前目录的父目录 @echo off echo batchfile=%0 echo full=%~f0 setlocal for %%d in (%~dp0.) do set Direct ...

  6. Linux部署Django:报错 nohup: ignoring input and appending output to ‘nohup.out’

    一.部署 Django 到远程 Linux 服务器 利用 xshell 通过 ssh 连接到 Linux服务器,常规的启动命令是 python3 manage.py runserver 但是,关闭 x ...

  7. Switch按钮

    使用CSS+HTML5修改原生checkbox为Switch Button .switch { width: 45px; height: 15px; position: relative; borde ...

  8. VS2017 Nuget服务器搭建,简易版

    熟悉Visual Studio 的小伙伴肯定听说过“Nuget”这个词,关于Nuget是如何如何方便就不再赘述了,这里主要介绍一下如何搭建个人的Nuget服务器. 直奔主题 第一步:打开VS2017 ...

  9. ASTC on Android

    kGL_KHR_texture_compression_astc_ldr kWEBGL_compressed_texture_astc_ldr KHR_texture_compression_astc ...

  10. (二)线程Thread中的方法详解

    1.start() start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果.通过start( ...