zoukankan      html  css  js  c++  java
  • 关于获得安卓外部存储读写权限

        最近做了一个关于相册的小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会自动被授权。此授权会在一开始打开一个请求权限页面,点击允许就会获取权限
    //对获取权限处理的结果
    @Override
    public 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);
    }
  • 相关阅读:
    Leetcode: Plus One Linked List
    Leetcode: Sort Transformed Array
    Leetcode: Rearrange String k Distance Apart
    Leetcode: Line Reflection
    Leetcode: Logger Rate Limiter
    Leetcode: Design Snake Game
    Leetcode: Android Unlock Patterns
    Leetcode: Longest Substring with At Most K Distinct Characters && Summary: Window做法两种思路总结
    Design Tic-Tac Toe
    Leetcode: Moving Average from Data Stream
  • 原文地址:https://www.cnblogs.com/zanzg/p/9129375.html
Copyright © 2011-2022 走看看