最近公司相机升级到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卡相关推荐

  1. Android本地文件存储,机身和外置sd卡

    在安卓的开发中,有时候要用到大文件的存储,这个时候就不能存储在应用内部(data/data),只能借助外部存储.而外部存储又分为手机机身的存储空间(一级sd卡)和外置sd卡存储空间(二级sd卡). 1 ...

  2. 外置存储权限在哪打开_安卓手机外置sd卡的权限怎么打开?

    展开全部 在2.x的版本中,在manifest中配e69da5e887aa3231313335323631343130323136353331333365633962置的权限android.permi ...

  3. Android判断有无外置SD卡(TF卡),并读写文件

    转载来源:https://blog.csdn.net/qq_27061049/article/details/94178875 1.相关方法说明: 2.Android Manifest.xml 添加权 ...

  4. Android Q 存储新特性适配脑壳疼?指南来了!

    码个蛋(codeegg)第 692 次推文 原文: https://mp.weixin.qq.com/s/aiDMyAfAZvaYIHuIMLAlcg 简单回顾下:Android Q 适配 之 存储新 ...

  5. 数据存储之——Android文件存储系统及文件系统(Android Q)

    Android存储系统及存储的挂载 Android是基于Linux内核开发的,所以它的文件系统也是跟Linux文件系统类似. 首先我们来看Android存储的分类. 内部存储和外部存储.内置SD卡和外 ...

  6. android 2.3 取内外置SD卡

    在android2.3中 判断内置SD卡是否挂载: if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ...

  7. Android 存储进化:分区存储

    一 分区存储概述 Android 10之前,Android的文件存储现象就像个垃圾桶,但凡app取得了存储空间的读写权限WRITE_EXTERNAL_STORAGE,就可以肆意创建文件,难以管理.用户 ...

  8. Android Q版本应用兼容性适配指导

    目录 Android Q版本应用兼容性适配指导... 1 1.      背景说明... 4 2.      存储空间限制... 4 2.1背景     4 2.2兼容性影响... 5 2.3 适配指 ...

  9. Android Q的全新特性与隐私权限

    在前几天的Google I/O 2019大会上,发布了Android Q版本(Android 10).Android Q带来了许多新特性,也增强安全隐私保护,包括支持折叠屏.非SDK接口限制.共享内存 ...

最新文章

  1. python二进制转字符串
  2. mount windows目录
  3. QT中使用QSettings保存应用程序配置信息
  4. Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
  5. crontab快速上手
  6. 做一个幸福的“生活家”:谈《心欢喜,灵快乐》
  7. html表格中绑定显示xml文档内容的简单实例,JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)...
  8. 继承情况下构造方法的调用过程-java
  9. FISCO BCOS 微众银行 WeDPR 隐私解决方案 资料汇总
  10. STM32——库函数流水灯程序
  11. python如何操作oracle数据库_Python连接oracle数据库的基本操作
  12. python医学科研中能做什么-科研画图都用什么软件?
  13. 大华摄像机初始化工具ConfigTool
  14. java简述什么是事务_java什么是事务意思概念
  15. 【读后感】《关键对话》
  16. [声纹识别]基于MFCC的声纹识别算法
  17. python tk checkbutton_Python tkinter之CheckButton(多选框)
  18. Android KeyCode列表 input keyevent XXX
  19. 笨办法学python__学习笔记
  20. 推荐引擎:从搜索到发现

热门文章

  1. Bloom Filter (布隆过滤器)
  2. GPT-4 插件和插件化的思考
  3. 2023年城市分站系统源码采用php语言
  4. centos7时间同步
  5. Java语言程序设计(一)计算题
  6. 什么是企业中台?企业为什么要建中台?企业如何建设中台?
  7. vscode之文件头部注释插件
  8. web3j java版本生成公钥、私钥、地址等实例
  9. 500粉丝,播放却超800w,B站这些被“埋没”的UP主做对了什么?
  10. zoom的成功带来的启示---zoom的夹缝有哪些