Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 注册文件扩展名的意图过滤器在URI中接收2个文件协议_Android - Fatal编程技术网

Android 注册文件扩展名的意图过滤器在URI中接收2个文件协议

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(无此选项) 文件或目

该应用程序注册一个特定的文件扩展名“.foo”,通常位于Android API称之为“外部存储”的根目录下,但谷歌文件浏览器称之为“内部存储”

但是,当我单击文件时,我收到一个奇怪的URI:

file:///1/file%3A/storage/emulated/0/config.foo

当我尝试对其执行
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"));