关于获得安卓外部存储读写权限

最近做了一个关于相册的小App,需要对安卓手机的存储设备进行读取,首先需要获取系统读写权限,在网上一顿好找,对于老手来说,可能很容易,对于菜鸟来说,就有点困难了,为了容易学习,特把自己写的一些心得写下,用以参考。如有不当之处,欢迎指正。

首先做一个关于手机内部存储和外部存储之间的介绍:

对内部存储设备不需要申请读写权限,一般是自动分配给手机的,在卸载app时消失:用getFileDirs()直接获取/data/data/packageName/files/xxx.

外部存储设备一般需要获取路径需要Environment.getExternalStorageDirectory()方法获取/storage/emulate/0/,亲测小米手机

一,主要是由于安卓6.0之后只在Manifest文件中写上这两个权限列表,已经不行了,需要写代码动态申请权限

<!--权限列表--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

二,以下是一下代码,我也是找来的,有链接,主要是加以解说,更好理解。下面是一个类,主要判断有没有授权,没有授权就授权
/** 借用博主的代码实现访问外部存储  https://blog.csdn.net/qq_23335213/article/details/78081114* */

/** * 关于申请授权 * 只需要在主界面申请一次即可 * 在其他子activity,自动授权 * */public class PermissionUtils {    //这是要申请的权限    private static String[] PERMISSIONS_CAMERA_AND_STORAGE = {            Manifest.permission.READ_EXTERNAL_STORAGE,            Manifest.permission.WRITE_EXTERNAL_STORAGE,            Manifest.permission.CAMERA};

/**     * 解决安卓6.0以上版本不能读取外部存储权限的问题     *     * @param activity     * @param requestCode     * @return     */    public static boolean isGrantExternalRW(Activity activity, int requestCode) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

int storagePermission = activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);            int cameraPermission = activity.checkSelfPermission(Manifest.permission.CAMERA);            //检测是否有权限,如果没有权限,就需要申请            if (storagePermission != PackageManager.PERMISSION_GRANTED ||                    cameraPermission != PackageManager.PERMISSION_GRANTED) {                //申请权限                activity.requestPermissions(PERMISSIONS_CAMERA_AND_STORAGE, requestCode);                //返回false。说明没有授权                return false;            }        }        //说明已经授权        return true;    }}

三,在具体的activity中如何使用

1.调用上面的类,来申请权限,在oncreate函数里面调用
//获取授权 这个if..else可以不写,直接写权限申请代码if (PermissionUtils.isGrantExternalRW(this, 1)) {

}
2.onRequestPermissionResult是对activity.requestPermissions()函数的回调,根据请求码做具体处理。如果没有授权,自然要授权后再能使用。只需要咋入口activity中申请权限即可,其它子activity会自动被授权。此授权会在一开始打开一个请求权限页面,点击允许就会获取权限//对获取权限处理的结果@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    switch (requestCode) {        case 1:            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {               //检验是否获取权限,如果获取权限,外部存储会处于开放状态,会弹出一个toast提示获得授权                String sdCard = Environment.getExternalStorageState();                if (sdCard.equals(Environment.MEDIA_MOUNTED)){                    Toast.makeText(this,"获得授权",Toast.LENGTH_LONG).show();                }            } else {                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(MainActivity.this, "buxing", Toast.LENGTH_SHORT).show();                    }                });            }            break;    }    super.onRequestPermissionsResult(requestCode, permissions, grantResults);}

原文地址:https://www.cnblogs.com/zanzg/p/9129375.html

时间: 2024-10-08 11:48:38

关于获得安卓外部存储读写权限的相关文章

Android 在外部存储读写文件

本文主要介绍android中如何在外部存储读写数据 sd卡的路径 sdcard:2.3之前的sd卡路径 mnt/sdcard:4.3之前的sd卡路径 storage/sdcard:4.3之后的sd卡路径 打开file explorer 可以看到sdcard是个空的文件夹,因为这个文件夹是个快捷方式,指向/storag文件夹,接着打开storag文件夹 读写sd卡 最简单的打开sd卡的方式 File file = new File("sdcard/info.txt"); * 写sd卡需要

外部存储读写

直接复制粘贴Android项目的修改项 项目名称 清单文件 res > strings >values 导包 外部存储路径演变 2.2之前:根目录下/sdcard 2.2之后:mnt/sdcard 4.2开始:storage/sdcard 在原来的盘符路径留下快捷方式目的是为了兼容低版本应用 路径api 在实际开发是需要使用路径api来获取外部存储的真实盘符路径,因为各大厂商的sd路径各不相同,为了兼容,在开发是需要使用api来获取sd路径的. Environment.getExternalS

Android 4.4以上的存储读写权限

最近遇到一个奇怪现象,直接往Android的SD卡根目录写入文件,报异常:open failed EACCES:permission denied. 已经在manifest.xml中加入android.permission.WRITE_EXTERNAL_STORAGE.权限 查询资料后才发现是由于Android 4.4以上限制了对SD卡(二级存储)的访问限制. 具体参看: Android_数据存储_File android4.4上sd卡的读写权限

安卓外部存储路径,吐司的优化问题

路径优化: 未使用API时: //外部存储空间路径"sdcard/info.txt",也可以"storage/sdcard/info.txt" File file =new File("sdcard/info.txt"); 使用API: //使用API,返回FILE对象,其路径是SD卡的真实路径 File file =new File(Environment.getExternalStorageDirectory(),"info.txt

Android外部存储

WeTest 导读 外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更.我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇怪怪的路径:/sdcard./mnt/sdacrd./storage/extSdCard./mnt/shell/emulated/0./storage/emulated/0./mnt/shell/runtime/default/emulated/0...其实,这背后代表了一项项技术的成熟与发布:模拟外部存储.多用户.运

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?

这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的文件夹. 用的是  Environment.getExternalStorageDirectory() 这种方法.然后在获取的文件夹中新建一个hkapp文件夹,用来存放下载的apk文件. 那么,这个hkapp文件究竟是在那块存储区域呢? 一開始,看看网上的API,已经这种方法的字面意思.想当然地以为它就是获取SD卡上的文件夹,而不是手机的内部存储. 当然.除了望文生义之外,似乎还有确凿的证据支持我的观点.那就是在执行的

Android简易实战教程--第十五话《在外部存储中读写文件》

第七话里面介绍了在内部存储读写文件 点击打开链接. 这样有一个比较打的问题,假设系统内存不够用,杀本应用无法执行,或者本应用被用户卸载重新安装后.以前保存的用户名和密码都不会得到回显.所以,有必要注意这个问题 因此把文件保存到sd卡中.即今天所写的  第十五话<在外部存储中读写文件> 首先布局文件和第七话一样: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:

狂刷Android范例之3:读写外部存储设备

狂刷Android范例之3:读写外部存储设备 说明 狂刷Android范例系列文章开张了.每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重点源代码进行简要分析.然后提供打包好的源代码下载. 功能 提供一个经典范例,监控Android外部存储设备状态,对公用目录,app私有目录进行读写操作,并展示在app界面上. 代码包在此,无需下载分: http://download.csdn.net/detail/logicteamleader/8790109 来源 ReadAss

Android 外部存储权限分析

不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131, KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作.如果用户想要将文件等copy到手机中,则只能 存储到内部存储器中,而无法存储到外置sdcard中,而且无法创建新的文件夹,这样一来给用户和开发者都带来了一定的不便.之所 以在KitKat之后版本中无法操作外置Sdcard,是因为Google更改了此模