Android问题解决--“StorageManager.getVolumeList NullPointerException”空指针再现,getExternalDirs
问题:
在获取外部存储目录时,在某些低版本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相关推荐
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法...
今天遇到了一个在servlet的service方法中获取ServletContext对象出现java.lang.NullPointerException(空指针)异常,代码如下: String pat ...
- Android问题解决
Android问题解决 @[TOC](Android问题解决) 1. 应用是非正式发布版本,请使用官方版本进行安装 1. 应用是非正式发布版本,请使用官方版本进行安装 在gradle.properti ...
- java.lang.NullPointerException空指针问题
对于一个Android新手而言遇见空指针问题是在所难免的.比如在调试时一开程序就出现"很抱歉!'XXX'已停止运行!"这是空指针的一种表现. 为什么会出现空指针? 所谓空指针异常, ...
- android measure的时候报空指针
1.使用listview的时候,在代码中动态设置其高度,在android低版本中,这个低版本是以4.4为界,会报measure的空指针,原因是低版本relativelayout有个bug,使用list ...
- java null指针_注意:java 这些地方经常发生 NullPointerException(空指针)异常
上一篇文章讲到java NullPointerException异常处理,这一篇来讲一下具体有哪些地方容易遇到NullPointerExcetion(空指针)异常. 磨刀不误砍柴工,不太清楚空指针的朋 ...
- 妈妈再也不用担心我会出现NullPointerException空指针了,java处理空指针,java利用Lambda处理空指针
Optional 真香 下面是以前不会用 Optional 自己想着一直实现 这里就不对 Optional 做介绍了 实体类: public class User {private User son; ...
- Android问题解决:android.util.Base64.encode 导致签名不匹配 SignatureDoesNotMatch
文章目录 前文:遇到问题 一问:为什么SignatureDoesNotMatch 二问:为什么SignatureDoesNotMatch 三问:Signature请求参数为什么多了%0A 四问:Sig ...
- android 行 64,android缺陷分析:内核空指针
高通Android 7.1平台出现内核崩溃,log如下: (红色是关键信息) [ 65.862388] msm_isp_get_buf: bug mgr open cnt = 0 [ 65.87176 ...
- 阿里云消息推送同时推送到iOS和android问题解决
1. SDK.InvalidRegionID :can not find endpoint to access 在阿里开发手册中给出的解决方法,产生原因是由于SDK核心包版本过低,升级版本即可解决. ...
- 程序运行时报错NullPointerException(空指针)情况以及解决方法
出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常 抛错场景 当对空属性或者空对象进行后台传值时可能会抛出异常.常见于接口传值为空或者返回值为空时 当对空属性或者空对象与另一个属性做比较时 问 ...
最新文章
- wireshark tcp data中文_wireshark流量分析入门
- NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V
- tf.nn.conv2d()方法
- struts文件上传时异常问题
- 网工小课堂(part1)--计算机网络概论
- 【渝粤教育】21秋期末考试建设工程法规10221k1
- Pytorch LSTM实例2
- php mysqli的乱码设置
- selenium-04-验证码问题
- 机器视觉:系统中影响图像质量的因素有哪些?
- mybatis使用和分析
- 基于STM32单片机设计指纹考勤机+上位机管理
- 【场景化解决方案】OA付款审批同步到金蝶KIS
- ABAP 透明表操作备忘 刘欣
- word目录编号自动更新排版技巧
- newt.h:没有那个文件或目录
- Android自绘控件开发与性能优化实践——以录音波浪动画为例
- CSS 字体文本样式
- 中铁员工入职培训心得体会
- FFmpeg入门详解之54:搭建环境ffmpeg