Android Q存储SD卡-Android29 存储外置SD卡
最近公司相机升级到AndroidQ 遇到无法存储SD卡,原来是Goole抛弃了原有的API(不是过时,是抛弃,导致之前的存储API不能用)查看Google API 进行了代码更换, 在在更换过程中遇到了比较多的坑,将部分关键代码记录下来,方便下次使用。
如果不使用外置可插拔SD卡的AndroidQ存储可以使用如下方法暂时不用 AndroidQ的存储方式
在AndroidManifest.xml 中添加android:requestLegacyExternalStorage="true"即可 如下
<application......省略代码android:requestLegacyExternalStorage="true". <activity>.......... 省略代码</activity></application>
如果是AndroidQ上 可插拔SD卡请看下面的方法;
Android 获取SD卡名称的时候区分大小写,我们用getUUid获取的是SD卡的大写名称,而Android只识别SD的小写名称,不知道是不是Bug,此坑比较深,一定切记。
如下是存储图片的关键代码
public static boolean writeFile(ContentResolver contentResolver, String title, String path, byte[] data) {FileOutputStream out = null;try {if (isSaveSDCard() && SDCard.instance().isWriteable()){ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DISPLAY_NAME, title);values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM+"/Camera/"); //修改路径Uri collection = MediaStore.Images.Media.getContentUri(SDCard.instance().getSdCardExternalVolumeName());Uri item = contentResolver.insert(collection, values);//获取插入路径Log.d("chencl_"," item insert Uri : " +item);ParcelFileDescriptor pfd = contentResolver.openFileDescriptor(item, "rw", null);if (pfd != null){out = (FileOutputStream) contentResolver.openOutputStream(item);if (out != null) {out.write(data);}}} else {out = new FileOutputStream(path);out.write(data);}} catch (Exception e) {Log.e(TAG, "Failed to write data", e);return false;} finally {try {if (out != null) {out.close();}} catch (Exception e) {Log.e(TAG, "Failed to close file after write", e);}}return true;}
如下是进行视频录像传路径的代码
Log.v(TAG, "New video filename: " + path);if (Storage.isSaveSDCard() && SDCard.instance().isWriteable()) {mCurrentVideoValues.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM+"/Camera");Uri collection = MediaStore.Video.Media.getContentUri(SDCard.instance().getSdCardExternalVolumeName());Uri item = mContentResolver.insert(collection, mCurrentVideoValues);try (ParcelFileDescriptor pfd = mContentResolver.openFileDescriptor(item, "rw", null)) {ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.fromFd(pfd.getFd());//必须转化一下不然录像提示无次文件mMediaRecorder.setOutputFile(parcelFileDescriptor.getFileDescriptor());// Write data into the pending image.} catch (IOException e) {e.printStackTrace();}} else {mMediaRecorder.setOutputFile(path);}
获取SD卡名称
public String getSdCardExternalVolumeName() {ArrayList<String> volumenames = new ArrayList<>( MediaStore.getExternalVolumeNames(mContext));return (volumenames.size() > VOLUME_SDCARD_INDEX) ? volumenames.get(VOLUME_SDCARD_INDEX) : null;}
获取SD卡的 Volume VOLUME_SDCARD_INDEX =1 为可插拔SD卡 VOLUME_SDCARD_INDEX =0 为内置SD卡
private void initVolume() {final StorageVolume[] volumes = ReflectionUtils.getVolumeList(mStorageManager);mVolume = (volumes.length > VOLUME_SDCARD_INDEX) ?volumes[VOLUME_SDCARD_INDEX] : null;mPath = null;mRawpath = null;}
判断是否存在SD卡
public static StorageVolume[] getVolumeList(StorageManager storageManager) {StorageVolume[] result = null;try {Class storageManagerCls = Class.forName("android.os.storage.StorageManager");Method getVolumeListMethod = storageManagerCls.getMethod("getVolumeList");getVolumeListMethod.setAccessible(true);result = (StorageVolume[]) getVolumeListMethod.invoke(storageManager);} catch (Exception e) {Log.e(TAG, "getVolumeList Exp:" + expToString(e));return result;}if (DEBUG) {Log.d(TAG, "getVolumeList result:" + result);}return result;}
Android Q存储SD卡-Android29 存储外置SD卡相关推荐
- Android本地文件存储,机身和外置sd卡
在安卓的开发中,有时候要用到大文件的存储,这个时候就不能存储在应用内部(data/data),只能借助外部存储.而外部存储又分为手机机身的存储空间(一级sd卡)和外置sd卡存储空间(二级sd卡). 1 ...
- 外置存储权限在哪打开_安卓手机外置sd卡的权限怎么打开?
展开全部 在2.x的版本中,在manifest中配e69da5e887aa3231313335323631343130323136353331333365633962置的权限android.permi ...
- Android判断有无外置SD卡(TF卡),并读写文件
转载来源:https://blog.csdn.net/qq_27061049/article/details/94178875 1.相关方法说明: 2.Android Manifest.xml 添加权 ...
- Android Q 存储新特性适配脑壳疼?指南来了!
码个蛋(codeegg)第 692 次推文 原文: https://mp.weixin.qq.com/s/aiDMyAfAZvaYIHuIMLAlcg 简单回顾下:Android Q 适配 之 存储新 ...
- 数据存储之——Android文件存储系统及文件系统(Android Q)
Android存储系统及存储的挂载 Android是基于Linux内核开发的,所以它的文件系统也是跟Linux文件系统类似. 首先我们来看Android存储的分类. 内部存储和外部存储.内置SD卡和外 ...
- android 2.3 取内外置SD卡
在android2.3中 判断内置SD卡是否挂载: if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ...
- Android 存储进化:分区存储
一 分区存储概述 Android 10之前,Android的文件存储现象就像个垃圾桶,但凡app取得了存储空间的读写权限WRITE_EXTERNAL_STORAGE,就可以肆意创建文件,难以管理.用户 ...
- Android Q版本应用兼容性适配指导
目录 Android Q版本应用兼容性适配指导... 1 1. 背景说明... 4 2. 存储空间限制... 4 2.1背景 4 2.2兼容性影响... 5 2.3 适配指 ...
- Android Q的全新特性与隐私权限
在前几天的Google I/O 2019大会上,发布了Android Q版本(Android 10).Android Q带来了许多新特性,也增强安全隐私保护,包括支持折叠屏.非SDK接口限制.共享内存 ...
最新文章
- python二进制转字符串
- mount windows目录
- QT中使用QSettings保存应用程序配置信息
- Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
- crontab快速上手
- 做一个幸福的“生活家”:谈《心欢喜,灵快乐》
- html表格中绑定显示xml文档内容的简单实例,JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)...
- 继承情况下构造方法的调用过程-java
- FISCO BCOS 微众银行 WeDPR 隐私解决方案 资料汇总
- STM32——库函数流水灯程序
- python如何操作oracle数据库_Python连接oracle数据库的基本操作
- python医学科研中能做什么-科研画图都用什么软件?
- 大华摄像机初始化工具ConfigTool
- java简述什么是事务_java什么是事务意思概念
- 【读后感】《关键对话》
- [声纹识别]基于MFCC的声纹识别算法
- python tk checkbutton_Python tkinter之CheckButton(多选框)
- Android KeyCode列表 input keyevent XXX
- 笨办法学python__学习笔记
- 推荐引擎:从搜索到发现