Android 注册文件扩展名的意图过滤器在URI中接收2个文件协议
该应用程序注册一个特定的文件扩展名“.foo”,通常位于Android API称之为“外部存储”的根目录下,但谷歌文件浏览器称之为“内部存储” 但是,当我单击文件时,我收到一个奇怪的URI: file:///1/file%3A/storage/emulated/0/config.foo 当我尝试对其执行Android 注册文件扩展名的意图过滤器在URI中接收2个文件协议,android,Android,该应用程序注册一个特定的文件扩展名“.foo”,通常位于Android API称之为“外部存储”的根目录下,但谷歌文件浏览器称之为“内部存储” 但是,当我单击文件时,我收到一个奇怪的URI: file:///1/file%3A/storage/emulated/0/config.foo 当我尝试对其执行OpenInputStream时,它会导致文件未找到异常: /1/file:/storage/emulated/0/config.foo:open failed:enoint(无此选项) 文件或目
OpenInputStream
时,它会导致文件未找到异常:
/1/file:/storage/emulated/0/config.foo:open failed:enoint(无此选项)
文件或目录)
舱单:
<activity
android:name=".MainActivity">
<intent-filter>
<!-- Can receive a transfer file and decrypt it -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.foo"/>
<data android:host="*"/>
</intent-filter>
</activity>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true">
由于FileNotFound
异常而失败的源代码:
Uri fileUri = getIntent().getData();
InputStream fis = appContext.getApplicationContext().getContentResolver().openInputStream(fileUri);
实验:
1:尝试直接打开该文件以查看我们是否具有访问权限:
String[] parts = fileUri.toString().split("%3A");
String path = parts[1];
File file = new File(path);
if (file.exists()) {
Log.i(TAG, "Exists");
}
2:测试openInputStream
是否可以打开文件:
InputStream fis = appContext.getApplicationContext().getContentResolver().openInputStream(Uri.parse("file:///storage/emulated/0/config.foo"));
实验1和2都成功了
我相信这段代码适用于旧版本的Android。我现在正在测试的设备是运行Android 10的Android One设备
我意识到谷歌已经改变了文件系统的方向,所有关于外部存储的代码都需要重写。然而,我正试图为这个问题找到一个暂时的解决办法
有人知道当从谷歌文件浏览器点击文件时,为什么要在URI中添加两次“文件”协议吗?如果有任何猜测或尝试,我将不胜感激。谢谢
版本:
您得到并应该使用的路径当然是/storage/emulated/0/config.foo。首先删除垃圾。@blackapps是的……这似乎是内置文件管理器的一个缺陷。您得到并应该使用的路径当然是/storage/emulated/0/config.foo。首先删除垃圾。@blackapps是的……这可能是内置文件管理器的缺陷。
InputStream fis = appContext.getApplicationContext().getContentResolver().openInputStream(Uri.parse("file:///storage/emulated/0/config.foo"));