android内外存储路径获取
来源:互联网 发布:淘宝店铺流失金额影响 编辑:程序博客网 时间:2024/05/17 07:46
最近使用android上传文件功能时遇到了uri获取不到绝对路径的问题,在网上查了好多方法,但是因为android手机机型比较多,因此通过单独判断uri来拼接地址不太好,因此找到了一个反射的方法来拼接路径,以上传txt文本为例。
打开txt文本的方法,记得加权限。
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("text/plain"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, 1);
获取内存卡的绝对路径,isMove是true的时候是外置内存卡,false内置存储
private String getFilePath(boolean isMove) { StorageManager mStorageManager = (StorageManager) getApplication().getSystemService(Context.STORAGE_SERVICE); Class<?> storageVolumeClazz = null; try { storageVolumeClazz = Class.forName("android.os.storage.StorageVolume"); Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList"); Method getPath = storageVolumeClazz.getMethod("getPath"); Method isRemovable = storageVolumeClazz.getMethod("isRemovable"); Object result = getVolumeList.invoke(mStorageManager); final int length = Array.getLength(result); for (int i = 0; i < length; i++) { Object storageVolumeElement = Array.get(result, i); String pathFile = (String) getPath.invoke(storageVolumeElement); boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement); if (isMove == removable) { return pathFile; } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; }
回调里面的代码
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1: if (resultCode == RESULT_OK) { if (data != null) { Uri uri = data.getData(); String finalPath = null; String[] urls = uri.getPath().toString().split(":"); finalPath = getFilePath(false) + File.separator + urls[1].toString().trim(); if (new File(finalPath).exists() == true) { } else { finalPath = getFilePath(true) + File.separator + urls[1].toString().trim(); } if (finalPath != null) { File file = new File(finalPath); FileInputStream f = null; try { f = new FileInputStream(file); byte[] buf = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(""); while (((hasRead = f.read(buf)) > 0)) { sb.append(new String(buf, 0, hasRead)); } Log.i("aa---", sb.toString()); f.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } else { tv_checkTv.setText("上传出现错误,请重新上传!"); } } } }
但是这里还有个一个问题就是不好判断选择的文件是外置存储还是内置存储的,我这里是先假设是内置存储,然后判断一下文件是否存在,如果不存在那文件肯定就是在外置存储。但是假如两个存储中存在同样的文件名称的话就会出现问题,因此大家有什么好的方法,一起讨论一下。
1 0
- android内外存储路径获取
- android 获取 内外存储设备路径疑问
- android 获取 内外存储设备路径疑问
- android 获取 内外存储设备路径疑问
- Android获取内外SD卡路径
- Android 获取存储路径
- Android 内外存储说明
- Android中获取内外存储卡位置的方法
- Android获取多存储路径
- 获取手机中内外存储卡
- Android的内外存储、SharedPreferences(偏好设置)及获取空间使用情况
- Android获取存储卡路径的方式
- Android获取存储卡路径的方式
- Android获取存储卡路径的方式
- Android获取存储卡路径的方式
- Android获取存储卡路径的方式
- Android获取所有存储卡挂载路径
- Android获取可存储文件所有路径
- Servlet(13)Servlet显示图片和分页
- virtualenv使用说明
- Eclipse共享项目到GitHub
- Ubuntu创建文件夹的桌面快捷方式
- USBKey系列产品在电子银行领域的应用概述
- android内外存储路径获取
- 杂记
- VC++ 如何隐藏控制台程序窗口
- 第四届 山东省ACM大学生程序设计竞赛
- HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用
- 洛谷 P2024 食物链
- linux中三大文本工具
- 用painEvent()和QPixmap()在QLabel上绘图
- CSS ICON