zoukankan      html  css  js  c++  java
  • Android 中 Environment.getExternalStorageDirectory()无效

      我们在处理缓存的时候,并不是每次都会在应用私有存储空间那里保存,很多时候是需要用到ExternalStorage。我们平时一般都是用Environment.getExternalStorageDirectory(),这在6.0以前一直是好的,(即使不对,那你的问题应该是没注意加权限,或者是格式不对之类又或者sdcard被移走了等等)。但是到了6.0以后,就发现怎么都不无法创建文件了。很多人就疑惑,该加的权限都加了,怎么就没法创建呢?

      原因是Android 6.0以后,google升级了Android的权限管理机制,对于一些敏感的权限,需要显性申请并被用户允许才可能运行。

        private void checkPermission() {
    
            if (Build.VERSION.SDK_INT >= 23) {
                int write = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                int read = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
                if (write != PackageManager.PERMISSION_GRANTED || read != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 300);
                } else {
                    String name = "CrashDirectory";
                    File file1 = new File(Environment.getExternalStorageDirectory(), name);
                    if (file1.mkdirs()) {
                        Log.i("wytings", "permission -------------> " + file1.getAbsolutePath());
                    } else {
                        Log.i("wytings", "permission -------------fail to make file ");
                    }
                }
            } else {
                Log.i("wytings", "------------- Build.VERSION.SDK_INT < 23 ------------");
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            if (requestCode == 300) {
                Log.i("wytings", "--------------requestCode == 300->" + requestCode + "," + permissions.length + "," + grantResults.length);
            } else {
                Log.i("wytings", "--------------requestCode != 300->" + requestCode + "," + permissions + "," + grantResults);
            }
        }

    备注:附上android的权限组,因为同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE_EXTERNAL_STORAGE被授权了,app也有READ_EXTERNAL_STORAGE.所以,你只申请一个就可以了。

    android.permission-group.CALENDAR
    • android.permission.READ_CALENDAR
    • android.permission.WRITE_CALENDAR
    android.permission-group.CAMERA
    • android.permission.CAMERA
    android.permission-group.CONTACTS
    • android.permission.READ_CONTACTS
    • android.permission.WRITE_CONTACTS
    • android.permission.GET_ACCOUNTS
    android.permission-group.LOCATION
    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_COARSE_LOCATION
    android.permission-group.MICROPHONE
    • android.permission.RECORD_AUDIO
    android.permission-group.PHONE
    • android.permission.READ_PHONE_STATE
    • android.permission.CALL_PHONE
    • android.permission.READ_CALL_LOG
    • android.permission.WRITE_CALL_LOG
    • com.android.voicemail.permission.ADD_VOICEMAIL
    • android.permission.USE_SIP
    • android.permission.PROCESS_OUTGOING_CALLS
    android.permission-group.SENSORS
    • android.permission.BODY_SENSORS
    android.permission-group.SMS
    • android.permission.SEND_SMS
    • android.permission.RECEIVE_SMS
    • android.permission.READ_SMS
    • android.permission.RECEIVE_WAP_PUSH
    • android.permission.RECEIVE_MMS
    • android.permission.READ_CELL_BROADCASTS
    android.permission-group.STORAGE
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE
  • 相关阅读:
    「SAP技术」SAP MM MB5M报表不显示特殊库存数据
    python-day3-条件判断与循环
    python-day2-运算符
    Mysql数据库意外崩溃导致表数据文件损坏无法启动的问题解决
    图书管理系统(Servlet+Jsp+Java+Mysql,附下载演示地址)
    求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法
    HTML+CSS+JavaScript实现植物大战僵尸(附演示地址)
    面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
    面试官:手撕十大排序算法,你会几种?
    用x种方式求第n项斐波那契数,99%的人只会第一种
  • 原文地址:https://www.cnblogs.com/wytings/p/5226101.html
Copyright © 2011-2022 走看看