问题:

在获取外部存储目录时,在某些低版本Android手机上发生StorageManager.getVolumeList 空指针错误,具体如下:

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.os.storage.StorageVolume[] android.os.storage.IStorageManager.getVolumeList(int, java.lang.String, int)' on a null object referenceat android.os.storage.StorageManager.getVolumeList(StorageManager.java:1267)at android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:109)at android.os.Environment.getExternalStorageState(Environment.java:1026)

分析:

getExternalDirs作用是获取sdcard的目录,在Android低版本(4.4以前),sdcard目录是指设备插入的真正的可插拔存储卡的目录;

在高版本(Android4.4以后),由于手机的存储空器越来越大,即使没有插入外部存储卡,系统也会默认创建sdcard,如果有卡插入,getExternalDirs就会返回多个File数组。

所以,上面的问题,应该发生在比较旧的设备上。

getExternalDirs 和getExternalDirs源码如下:

Environment.java:/*** Returns the current state of the primary shared/external storage media.** @see #getExternalStorageDirectory()* @return one of {@link #MEDIA_UNKNOWN}, {@link #MEDIA_REMOVED},*         {@link #MEDIA_UNMOUNTED}, {@link #MEDIA_CHECKING},*         {@link #MEDIA_NOFS}, {@link #MEDIA_MOUNTED},*         {@link #MEDIA_MOUNTED_READ_ONLY}, {@link #MEDIA_SHARED},*         {@link #MEDIA_BAD_REMOVAL}, or {@link #MEDIA_UNMOUNTABLE}.*/public static String getExternalStorageState() {final File externalDir = sCurrentUser.getExternalDirs()[0];return getExternalStorageState(externalDir);}/** {@hide} */public static class UserEnvironment {private final int mUserId;@UnsupportedAppUsagepublic UserEnvironment(int userId) {mUserId = userId;}@UnsupportedAppUsagepublic File[] getExternalDirs() {final StorageVolume[] volumes = StorageManager.getVolumeList(mUserId,StorageManager.FLAG_FOR_WRITE);final File[] files = new File[volumes.length];for (int i = 0; i < volumes.length; i++) {files[i] = volumes[i].getPathFile();}return files;}@UnsupportedAppUsage@Deprecatedpublic File getExternalStorageDirectory() {return getExternalDirs()[0];}@UnsupportedAppUsage@Deprecatedpublic File getExternalStoragePublicDirectory(String type) {return buildExternalStoragePublicDirs(type)[0];}。。。}

可见,getExternalDirs被注解为@UnsupportedAppUsage, 表示该api已经不被支持App使用了。

getExternalDirs调用了StorageManager.getVolumeList, 而正是在这里发生了NullPointerException。

StorageManager.getVolumeList代码定义在StorageManager.java:

/** {@hide} */@UnsupportedAppUsagepublic static @NonNull StorageVolume[] getVolumeList(int userId, int flags) {final IStorageManager storageManager = IStorageManager.Stub.asInterface(ServiceManager.getService("mount"));try {String packageName = ActivityThread.currentOpPackageName();if (packageName == null) {// Package name can be null if the activity thread is running but the app// hasn't bound yet. In this case we fall back to the first package in the// current UID. This works for runtime permissions as permission state is// per UID and permission realted app ops are updated for all UID packages.String[] packageNames = ActivityThread.getPackageManager().getPackagesForUid(android.os.Process.myUid());if (packageNames == null || packageNames.length <= 0) {return new StorageVolume[0];}packageName = packageNames[0];}final int uid = ActivityThread.getPackageManager().getPackageUid(packageName,PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);if (uid <= 0) {return new StorageVolume[0];}return storageManager.getVolumeList(uid, packageName, flags); //1267行} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}

再对比错误信息和代码行数:

错误信息:

“at android.os.storage.StorageManager.getVolumeList(StorageManager.java:1267)”

代码行数截图:

问题解决:

1. 在api调用的时候,进行try catch异常的捕获,以及null的判空;

2. 进行sdk level的判断,在低版本和高版本进行区别对待。


Android问题解决--“StorageManager.getVolumeList NullPointerException”空指针再现,getExternalDirs相关推荐

  1. 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法...

    今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: String pat ...

  2. Android问题解决

    Android问题解决 @[TOC](Android问题解决) 1. 应用是非正式发布版本,请使用官方版本进行安装 1. 应用是非正式发布版本,请使用官方版本进行安装 在gradle.properti ...

  3. java.lang.NullPointerException空指针问题

    对于一个Android新手而言遇见空指针问题是在所难免的.比如在调试时一开程序就出现"很抱歉!'XXX'已停止运行!"这是空指针的一种表现. 为什么会出现空指针? 所谓空指针异常, ...

  4. android measure的时候报空指针

    1.使用listview的时候,在代码中动态设置其高度,在android低版本中,这个低版本是以4.4为界,会报measure的空指针,原因是低版本relativelayout有个bug,使用list ...

  5. java null指针_注意:java 这些地方经常发生 NullPointerException(空指针)异常

    上一篇文章讲到java NullPointerException异常处理,这一篇来讲一下具体有哪些地方容易遇到NullPointerExcetion(空指针)异常. 磨刀不误砍柴工,不太清楚空指针的朋 ...

  6. 妈妈再也不用担心我会出现NullPointerException空指针了,java处理空指针,java利用Lambda处理空指针

    Optional 真香 下面是以前不会用 Optional 自己想着一直实现 这里就不对 Optional 做介绍了 实体类: public class User {private User son; ...

  7. Android问题解决:android.util.Base64.encode 导致签名不匹配 SignatureDoesNotMatch

    文章目录 前文:遇到问题 一问:为什么SignatureDoesNotMatch 二问:为什么SignatureDoesNotMatch 三问:Signature请求参数为什么多了%0A 四问:Sig ...

  8. android 行 64,android缺陷分析:内核空指针

    高通Android 7.1平台出现内核崩溃,log如下: (红色是关键信息) [ 65.862388] msm_isp_get_buf: bug mgr open cnt = 0 [ 65.87176 ...

  9. 阿里云消息推送同时推送到iOS和android问题解决

    1. SDK.InvalidRegionID :can not find endpoint to access 在阿里开发手册中给出的解决方法,产生原因是由于SDK核心包版本过低,升级版本即可解决. ...

  10. 程序运行时报错NullPointerException(空指针)情况以及解决方法

    出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常 抛错场景 当对空属性或者空对象进行后台传值时可能会抛出异常.常见于接口传值为空或者返回值为空时 当对空属性或者空对象与另一个属性做比较时 问 ...

最新文章

  1. wireshark tcp data中文_wireshark流量分析入门
  2. NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V
  3. tf.nn.conv2d()方法
  4. struts文件上传时异常问题
  5. 网工小课堂(part1)--计算机网络概论
  6. 【渝粤教育】21秋期末考试建设工程法规10221k1
  7. Pytorch LSTM实例2
  8. php mysqli的乱码设置
  9. selenium-04-验证码问题
  10. 机器视觉:系统中影响图像质量的因素有哪些?
  11. mybatis使用和分析
  12. 基于STM32单片机设计指纹考勤机+上位机管理
  13. 【场景化解决方案】OA付款审批同步到金蝶KIS
  14. ABAP 透明表操作备忘 刘欣
  15. word目录编号自动更新排版技巧
  16. newt.h:没有那个文件或目录
  17. Android自绘控件开发与性能优化实践——以录音波浪动画为例
  18. CSS 字体文本样式
  19. 中铁员工入职培训心得体会
  20. FFmpeg入门详解之54:搭建环境ffmpeg

热门文章

  1. 批量修改字幕文件中的时间,c语言实现
  2. ug二次开发python_学习UG NX软件二次开发你必须具备这些基础!
  3. 银行笔试 - 数据库基础知识总结
  4. 游戏开发需要懂几种语言?
  5. 网页视频无法快进播放时(刷网课)
  6. 三峡大学学生选课系统_三峡大学选课系统操作流程
  7. kettle入门教程
  8. 软件开发测试验收通知书,软件验收报告(共7篇).doc
  9. CPU缓存侧信道攻击
  10. oracle rman在线备份,Oracle的RMAN备份与恢复脚本