我们在处理缓存的时候,并不是每次都会在应用私有存储空间那里保存,很多时候是需要用到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

最新文章

  1. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
  2. oracle普通用户登录em
  3. (利用tempdata判断action是直接被访问还是重定向访问)防止微信活动中用户绕过关注公众号的环节
  4. .net RPC框架选型
  5. Hibernate @OneToMany 一对多注解
  6. pair&lt;&gt;结构体模版的用法
  7. js-错误处理与调试,JSON
  8. get a new level 25 battle pet in about an hour
  9. Android API中常用的包(转)
  10. Javascript零散知识点总结
  11. 【阿里云产品公测】离线归档OAS,再也不用担心备份空间了
  12. 【c】time.h
  13. phonegap platform add ios 出错的问题
  14. oracle 所有下级
  15. c#调用命令行遇到带空格的路径
  16. php 文件上传的基本方法
  17. eclipse 一些快捷键
  18. bitmap资源回收
  19. Web程序员们,你准备好迎接HTML5了吗?
  20. JS 对象API之获取原型对象

热门文章

  1. Docker原理 -- namespace与CGroup
  2. 【洛谷 P4168】[Violet]蒲公英(分块)
  3. 中断处理函数中不用disable_irq而用disable_irq_nosync原因【转】
  4. k8s的存储Volume
  5. Juel Getting Started
  6. Liquibase 快速开始
  7. hdu 5184(数学-卡特兰数)
  8. 安卓长按交互onCreateContextMenu的简单 用法
  9. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
  10. HDU 2647 Reward【反向拓扑排序】