Android如何跨应用获取其他应用生成的文件,空指针报错如何解决
问题根因
你遇到的空指针异常是directory.listFiles()返回null导致的,本质是Android系统的分区存储限制:从Android 10(API 29)开始,普通应用默认无法访问其他应用在/storage/emulated/0/Android/data/下的私有目录,你当前配置的普通存储权限、FileProvider都无法突破该限制(FileProvider仅用于你的应用向其他应用共享自有文件,对读取其他应用私有目录无效)。
解决方案
适配不同安卓版本
1. Android 6.0-Android 9(API 23-28)
- 除Manifest中声明读写权限外,需要在代码中动态申请存储权限,用户授权后才可访问其他应用的公开目录。
- 代码访问前增加判空逻辑,避免目录不存在时触发崩溃,优化后的代码参考:
public ArrayList<String> FetchImages() { ArrayList<String> filenames = new ArrayList<>(); String path = "/storage/emulated/0/Android/data/abc/files/"; File directory = new File(path); // 先校验目录合法性 if (directory.exists() && directory.isDirectory() && directory.canRead()) { File[] files = directory.listFiles(); // 判空避免空指针 if (files != null) { for (File file : files) { filenames.add(file.getAbsolutePath()); } } } return filenames; }
2. Android 10(API 29)
- 在xyz应用的
AndroidManifest.xml的<application>节点添加属性,临时关闭分区存储,使用旧版权限逻辑:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
- 配合动态申请的读写权限即可访问目标目录,同时保留上面的判空逻辑。
3. Android 11及以上(API 30+)
普通存储权限已无法访问其他应用的Android/data目录,需要申请特殊的所有文件访问权限:
- 在
AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 代码中引导用户手动开启权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 1001); } }
注意:如果要上架谷歌应用商店,使用
MANAGE_EXTERNAL_STORAGE权限需要向谷歌提交用途说明,不符合政策会被拒审。
更合规的替代方案(如果你同时开发abc和xyz两个应用)
不需要申请高危存储权限,两种实现方式:
- 两个应用配置相同的
android:sharedUserId,并且使用相同签名打包,即可直接互相访问私有目录; - 在abc应用中配置FileProvider,将自身的files目录共享给指定包名的xyz应用,通过ContentResolver访问文件。
内容的提问来源于stack exchange,提问作者Shivendra Kr. Sahu
相关产品推荐
相关产品推荐

