Android 中 Environment.getExternalStorageDirectory()无效
2024-08-27 23:05:20
我们在处理缓存的时候,并不是每次都会在应用私有存储空间那里保存,很多时候是需要用到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-group.CAMERA |
|
android.permission-group.CONTACTS |
|
android.permission-group.LOCATION |
|
android.permission-group.MICROPHONE |
|
android.permission-group.PHONE |
|
android.permission-group.SENSORS |
|
android.permission-group.SMS |
|
android.permission-group.STORAGE |
|
最新文章
- 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程
- oracle普通用户登录em
- (利用tempdata判断action是直接被访问还是重定向访问)防止微信活动中用户绕过关注公众号的环节
- .net RPC框架选型
- Hibernate @OneToMany 一对多注解
- pair<;>;结构体模版的用法
- js-错误处理与调试,JSON
- get a new level 25 battle pet in about an hour
- Android API中常用的包(转)
- Javascript零散知识点总结
- 【阿里云产品公测】离线归档OAS,再也不用担心备份空间了
- 【c】time.h
- phonegap platform add ios 出错的问题
- oracle 所有下级
- c#调用命令行遇到带空格的路径
- php 文件上传的基本方法
- eclipse 一些快捷键
- bitmap资源回收
- Web程序员们,你准备好迎接HTML5了吗?
- JS 对象API之获取原型对象
热门文章
- Docker原理 -- namespace与CGroup
- 【洛谷 P4168】[Violet]蒲公英(分块)
- 中断处理函数中不用disable_irq而用disable_irq_nosync原因【转】
- k8s的存储Volume
- Juel Getting Started
- Liquibase 快速开始
- hdu 5184(数学-卡特兰数)
- 安卓长按交互onCreateContextMenu的简单 用法
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
- HDU 2647 Reward【反向拓扑排序】