快速解决设置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. 第三章、前端之JavaScript

    目录 第三章.前端之JavaScript 一.javaScript的引入方式 二.JavaScript语言的规范 三.语言基础 变量声明 四.数据类型 五.流程控制 六.函数 函数的argument ...

  2. Oracle笔记(十四) 用户管理

    SQL语句分为三类:DML.DDL.DCL,之前已经讲解完了DML和DDL,现在就差DCL操作的,DCL主要表示的是数据库的控制语句,控制的就是操作权限,而在DCL之中,主要有两个语法:GRANT.R ...

  3. 6. Design Patterns with First-Class Functions

    1. Refactoring Strategy 1.1 Classic Strategy from abc import ABC, abstractmethod from collections im ...

  4. SVN建立分支和合并代码

    1.SVN建立分支正确SVN服务器上会有两个目录:trunk和branches.trunk目录下面代码就是所谓的主版本,而branches文件夹主要是用来放置分支版本.分支版本是依赖于主版本的,因此建 ...

  5. MyBatis-08-使用注解开发

    8.使用注解开发 8.1.面向接口编程 面向接口编程的根本原因:解耦,可拓展,提高复用,分层开发中.上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性好 8.2.使用注解开发 注解在 ...

  6. nodejs解析url参数的三种方法

    要解析的url:http://127.0.0.1:8090/?name=cpc&age=21 利用js字符串操作函数进行解析 const myserver = require("ht ...

  7. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流(转)

    什么是Fork/Join框架        Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我 ...

  8. 解决CMD控制台乱码问题

    在cmd控制台中出现乱码情况如下 解决方式1 在控制台中输入    CHCP65001 按enter回车键查看 注:CHCP是一个计算机指令,能够显示或设置活动代码页编号. 代码页    描述6500 ...

  9. Spring中,请求参数处理

    Spring中,Controller里,获取请求数据有多种情况 在使用@RequestParam的方式获取请求中的参数时, 如果没有设置required这个属性,或者主动设置为true,则意味着这个参 ...

  10. 洛谷P1436 棋盘分割

    洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...