当用户从另一个应用程序(如文件管理器应用程序)单击 pdf 文件时,如何将我的 pdf 阅读器应用程序添加为隐式意图?
Posted
技术标签:
【中文标题】当用户从另一个应用程序(如文件管理器应用程序)单击 pdf 文件时,如何将我的 pdf 阅读器应用程序添加为隐式意图?【英文标题】:How can I add my pdf Reader app as an implicit intent when a user clicks a pdf file from another app, like a file manager app? 【发布时间】:2018-10-15 05:59:33 【问题描述】:当用户从文件管理器应用程序中单击 pdf 文件时,我一直在尝试将我的 PDF 阅读器应用程序添加为隐式意图,但我的应用程序没有显示为打开该 pdf 文件的选项,而仅显示为其他Adobe Reader 和 Google Reader show 等应用程序。 我该怎么做,我已经尝试在 manifest.xml 的活动中添加意图过滤器,但它不起作用。 我将显示 manifest.xml 文件,直到现在我已经尝试过,但仍然没有得到预期的结果。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".ActivityPdfView" >
</activity>
<activity android:name=".ActivityMain" >
</activity>
<activity android:name=".ActivitySplash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="http" />
<data android:host="*" />
<data android:pathPattern=".*\\.pdf" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="http" />
<data android:host="*" />
<data android:mimeType="application/pdf" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="file" />
<data android:host="*" />
<data android:pathPattern=".*\\.pdf" />
</intent-filter>
</activity>
<activity
android:name=".ActivitySetting"
android:label="@string/title_activity_setting" />
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent" />
<!-- This meta-data tag is required to use Google Play Services. -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:host="*" />
<data android:pathPattern=".*\\.pdf" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:host="*" />
<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" />
<data android:host="*" />
<data android:pathPattern=".*\\.pdf" />
</intent-filter>
</application>
</manifest>
【问题讨论】:
您可以使用apktool
之类的东西来反编译其他 APK 并查看它们的清单是什么样的。
【参考方案1】:
您有三个<intent-filter>
元素是<application>
的直接子元素。这些将被忽略。如果您希望<intent-filter>
触发<activity>
,则<intent-filter>
需要是该<activity>
的子级。
您的ActivitySplash
<intent-filter>
元素都不可能被使用。如果您想回复ACTION_VIEW
,请使用<action android:name="android.intent.action.VIEW" />
和<category android:name="android.intent.category.DEFAULT" />
,而不是<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
。
由于file
Uri
schemes have been largely banned since Android 7.0,任何file
<intent-filter>
都不太可能被使用。为content
Uri
和application/pdf
MIME 类型添加<intent-filter>
以获得更大的兼容性。
由于http
Uri
方案在 Android P 上默认不可用,请确保除了支持 http
之外还支持 https
。
【讨论】:
谢谢你,我正在努力按照你说的做,但是当另一个 pdf 文件被选中时,我需要在哪个 Activity 中放置意图过滤器以使我的应用程序显示为隐式意图应用程序? @cardaguh:当用户选择 PDF 时,它将在您想要控制的任何活动中。我无法告诉您应该提供哪些活动来查看 PDF。 我已经在每个活动中添加了意图过滤器,但是当我选择 pdf 文件时,我的应用程序没有作为选项出现在文件管理器中。我做错了什么? @cardaguh:嗯,正如我在回答中指出的那样,您的<intent-filter>
元素大多不正确。
感谢您的帮助,我会尝试解决修改意图过滤器的问题。以上是关于当用户从另一个应用程序(如文件管理器应用程序)单击 pdf 文件时,如何将我的 pdf 阅读器应用程序添加为隐式意图?的主要内容,如果未能解决你的问题,请参考以下文章