快速解决设置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. beego学习笔记一:创建第一个beego Web项目 转

    前提工作 环境搭建,可以参考如下两篇教程:搭建Go语言环境1搭建Go语言环境2 安装beego beego 的安装是典型的 Go 安装包的形式: go get github.com/astaxie/b ...

  2. CHD-5.3.6集群上hive安装

    解压过后: [hadoop@master CDH5.3.6]$ ls -rlttotal 8drwxr-xr-x. 17 hadoop hadoop 4096 Jun  2 16:07 hadoop- ...

  3. JavaSpring【七、AspectJ】

    AspectJ 概念 @AspectJ类似纯Java注解的普通Java类 Spring可以使用AspectJ来作为切入点 AOP在运行时仍是纯SpringAOP,对AspectJ无依赖 配置: 对@A ...

  4. EasyUI中取的DataGrid中选中行数据

    dataGrid中显示列:ItemID,ItemCode,ItemName,Note 一.选中一行 var selRow = $('#dataGrid').datagrid('getSelected' ...

  5. Istio调用链埋点原理剖析—是否真的“零修改”分享实录(下)

    调用链原理和场景 正如Service Mesh的诞生是为了解决大规模分布式服务访问的治理问题,调用链的出现也是为了对应于大规模的复杂的分布式系统运行中碰到的故障定位定界问题.大量的服务调用.跨进程.跨 ...

  6. PAT Advanced 1153 Decode Registration Card of PAT (25 分)

    A registration card number of PAT consists of 4 parts: the 1st letter represents the test level, nam ...

  7. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  8. 【Java 关键字this 的使用】还阔以调用重载的构造方法

    笔记: /** this 关键字的使用除了调用方法和变量外, * 还可以用来显示 调用当前类的重载的指定的构造方法! * 同时也应该必须放到该方法内部的首行! */ 测试: import java.l ...

  9. 域知识深入学习一:Active Directory 域服务

      AD DS用来组织,管理,控制网络资源 1.1 Active Directory 域服务概述 AD内的directorydatabase(目录数据库)用来存储用户账户,计算机账户,打印机与共享文件 ...

  10. 01—EF开山篇,ORM介绍

    我是2014年接触的EF,用了一年多,感觉非常的方便,现在的公司没有使用,最近有朋友接了两个项目找我帮忙,都想使用EF,自己也有断时间没有使用,借着这个机会复习下.Entity Framework,简 ...