android如何获取操作外置sd卡的权限
来源:互联网 发布:淘宝靠谱美国代购 编辑:程序博客网 时间:2024/06/05 20:58
因项目的需要,最近在做一个类似es文件管理器的app.但是在操作外置sd卡的时候碰到了各种权限的问题,现在很多的手机都没有外置sd卡,网上说的很多都是内置SD卡的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
注意在6.0后要动态申请
private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; //检测是否有写的权限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 没有写的权限,去申请写的权限,会弹出对话框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); }
但是我需要的是外置sd,这并不是我想要的。外置SD卡的权限是
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
这个需要的系统的签名,一般的app拿不到系统的签名,如果只是在自己的系统上使用,可以考虑这个,比较省事。但是es浏览器是没有获取到系统签名的,后来发现主要是使用了DocumentFile这个类,要使用这个就要拿到一个DOCUMENT_TREE
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, 1); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == DIRECTORY_CHOOSE_REQ_CODE) { //获取返回的Uri,这个uri就可以用来创建DocumentFile,在第一次使用es浏览器的时候会进入一个文件夹 Uri uri = data.getData(); Log.e(TAG, "uri ="+uri.toString()); //mkdirsOnTFCard(uri); Log.e("onActivityResult", "没有返回的resultCode"); } }
下面是这个类的用法
public void mkdirsOnTFCard(Uri uri) { //创建DocumentFile,注意只能一级一级创建,不能像File那样一次创建多级目录 DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri); /** * 如果没有该文件夹,则创建一个新的文件并写入内容 * 查询文件是否存在时,返回的是DocumentFile对象 * 所以这里应该用try-catch来判断,出现异常则不存在此文件 */ boolean ishasDirectory; try { ishasDirectory = pickedDir.findFile("sss").exists(); } catch (Exception e) { ishasDirectory = false; } if (!ishasDirectory) { try { //创建新的一个文件夹 pickedDir.createDirectory("sss"); //找到新文件夹的路径 pickedDir = pickedDir.findFile("sss"); //创建新的文件 DocumentFile newFile = pickedDir.createDirectory("new_file"); //写入内容到新建文件 OutputStream out = getContentResolver().openOutputStream(newFile.getUri()); if (out != null) { out.write("test".getBytes()); out.close(); } Toast.makeText(this, "创建成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(this, "创建失败", Toast.LENGTH_SHORT).show(); } } }
拿到根目录的DocumentFile 可以遍历出所有的文件,可以根据这个出创建文件夹,完成文件夹的复制功能。
阅读全文
1 0
- android如何获取操作外置sd卡的权限
- 如何获取外置的SD卡路径
- android 获取外置SD卡的路径
- android获取外置SD卡的路径
- Android 获取外置SD卡
- 获取外置的SD卡
- Android对外置sd卡的权限问题(上)
- Android手机外置SD卡(TF卡)的获取方法
- android 获取外置SD卡的路径(非挫版)
- android 获取外置SD卡的路径(非挫版)
- android 获取外置SD卡的路径(非挫版)
- Android获取内置和外置sd卡路径的方法
- Android 对5.0+的外置SD卡删除操作
- android 获取外置sd卡根目录
- Android判断获取内置外置sd卡
- Android 4.0获取外置SD卡 路径
- android 手机获取外置SD卡路径
- Android 获取外置SD卡路径
- MonoDevelop中使用 External Tools
- 深入理解 Kotlin Coroutine (一)
- bzoj 2705(欧拉函数)
- 9-22 deque, STL集锦
- Freemarker实现网页静态化
- android如何获取操作外置sd卡的权限
- 第二周三种传递方法
- uva 1395Slim Span
- 【androidx86 5.1.1】Android HttpClient请求过程解析(下)
- 当creator遇上protobufjs—pbkiller插件
- 树状数组
- with引起的类的扩充
- Java学习第五天
- 深入理解 Kotlin coroutine (二)