Android Studio中代码读取/data/app文件夹遇空指针异常求助
问题分析与解决方案
为什么你的代码读不了/data/app?
Android从**Android 6.0(API 23)开始收紧了存储权限管控,/data/app属于系统级受保护目录,普通第三方应用默认没有直接访问的权限。那些能做到无Root访问的应用(比如ShareIt、APK备份工具),要么是拿到了厂商白名单的特殊系统权限,要么是用了存储访问框架(SAF)**让用户手动授权访问,不是直接通过File API硬读的。
你的代码里new File("/data/app").listFiles()因为权限不足返回了null,后续直接访问files.length自然就触发空指针异常了。
可行解决方案
方案1:用存储访问框架(SAF)让用户手动授权(最合规)
这是普通第三方应用能访问该目录的唯一合法路径,不需要Root,步骤如下:
- 启动SAF目录选择器,引导用户选择
/data/app:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, 100);
- 在
onActivityResult里处理用户选择的目录,遍历内容:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK) { Uri treeUri = data.getData(); // 持久化权限,下次打开不用再授权 getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); DocumentFile rootDir = DocumentFile.fromTreeUri(this, treeUri); if (rootDir != null && rootDir.isDirectory()) { for (DocumentFile file : rootDir.listFiles()) { Log.d("APP_LIST", file.getName() + " - " + file.getUri()); } } } }
方案2:适配旧版本Android(API < 23)
如果你的应用只针对Android 5.1及以下版本,可以在Manifest里声明READ_EXTERNAL_STORAGE权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但注意:这种方式在API 23+完全无效,系统会直接拦截对/data/app的访问。
方案3:系统级权限(不推荐给普通应用)
如果你的应用是系统预装应用,或者能拿到厂商的签名权限,可以申请android.permission.READ_PRIVILEGED_STORAGE权限,但普通第三方应用根本拿不到这个权限,所以不做重点推荐。
额外避坑提示
永远不要默认listFiles()不会返回null,先做判空处理可以避免空指针:
File appDir = new File("/data/app"); if (appDir.exists() && appDir.isDirectory()) { File[] files = appDir.listFiles(); if (files != null) { for (File file : files) { System.out.println(file.getAbsolutePath()); } } else { Log.e("ACCESS_ERROR", "无权限访问/data/app目录"); } }
内容的提问来源于stack exchange,提问作者Ragib
相关产品推荐
相关产品推荐

