如何从意图过滤器接收 pdf 文件 - Android

Posted

技术标签:

【中文标题】如何从意图过滤器接收 pdf 文件 - Android【英文标题】:How to receive pdf file from intent filter - Android 【发布时间】:2021-11-30 01:11:47 【问题描述】:

我已经构建了一个 PDF 阅读器,我想从手机 Ex 的任何地方打开 pdf。 Whatsapp,文件管理器。

当我从谷歌文件管理器打开 pdf 时它正在工作,当我从默认文件管理器打开它时它会崩溃

显示此错误

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference

应用清单文件

        <activity
        android:name=".PDF_Viewer"
        android:exported="true">

        <intent-filter>

            <action
                android:name="android.intent.action.VIEW" />

            <category
                android:name="android.intent.category.DEFAULT" />

            <data
                android:mimeType="application/pdf" />

        </intent-filter>

        <intent-filter>

            <action
                android:name="android.intent.action.VIEW" />

            <category
                android:name="android.intent.category.DEFAULT" />

            <data
                android:scheme="file"
                android:host="*"
                android:pathPattern=".*\.pdf" />
        </intent-filter>

        <intent-filter>

            <action
                android:name="android.intent.action.VIEW" />

            <category
                android:name="android.intent.category.DEFAULT" />

            <category
                android:name="android.intent.category.BROWSABLE" />

            <data
                android:scheme="http"
                android:host="*"
                android:pathPattern=".*\.pdf" />

            <data
                android:scheme="https"
                android:host="*"
                android:pathPattern=".*\.pdf" />
        </intent-filter>

    </activity>

我在 PDF 查看器活动中收到这样的意图:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Uri pdf = (Uri) bundle.get(Intent.EXTRA_STREAM);

【问题讨论】:

发布更多代码,因为这个包来自某个地方。您的 NullPointerException 告诉 bundle==null。使用前检查是否为空。 我添加了更多代码,请检查 您没有在使用前添加代码来检查是否为空。此外,您没有提供额外信息。你现在会做什么 bundle==null ? 我不会在使用前检查捆绑包是否为空,如果您知道如何修复它,请帮助 -@blackapps 使用前检查bundle是否为空!添加代码!我第三次问了。 【参考方案1】:

您的所有三个&lt;intent-filters&gt; 都用于ACTION_VIEW。 The documentation for ACTION_VIEW 有:

输入:getData() 是从中检索数据的 URI。

因此,考虑到这一点,请将您的 Java 代码替换为:

Intent intent = getIntent();
Uri pdf = intent.getData();

您可以考虑检查现有的 PDF 查看器应用程序以了解它们的工作原理。比如many open source ones listed on F-Droid。

【讨论】:

以上是关于如何从意图过滤器接收 pdf 文件 - Android的主要内容,如果未能解决你的问题,请参考以下文章

简述 IntentFilter(意图过滤器)

当用户从另一个应用程序(如文件管理器应用程序)单击 pdf 文件时,如何将我的 pdf 阅读器应用程序添加为隐式意图?

如何从发送意图接收数据?

通过意图过滤器启动时,应用程序不会显示在“最近”屏幕中

如何让我的应用出现在应用选择器中?

未使用数据/主机意图过滤器调用 Android 接收器