注册 android 应用程序以接收特定文件类型
Registering an android app to receive certain file types
我希望我的应用程序能够接收电子名片。通常来自电子邮件附件,但也来自文件等。不幸的是,它没有显示在 "Open with" / "Share with" 菜单中。
这是清单中的 activity 定义:
<activity
android:name=".MyMainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.BROWSABLE"/>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
<data android:scheme="http" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="https" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="content" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\.vcf"/>
</intent-filter>
</activity>
我的测试 vCard 电子邮件附件具有 .vcf
文件扩展名,并且电子邮件将 mimetype 标记为 text/vcard
。我使用了 *.*
mimetype 进行测试 - 显然这不适合生产代码。
上面的代码是从其他 Whosebug 问题、博客文章等中抄袭的。我最初是从以下内容开始的(两者的 mimetype 都是 text/vcard
,然后是 */*
:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
对于 Web URL 和大多数设备上的用途,这应该与 "Open With" 种类的选项一起使用:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/vcard" />
</intent-filter>
如果你也想支持"Share With",你可以试试:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/vcard" />
</intent-filter>
请注意,您获取内容的方式因这两个操作而异:
- 对于
ACTION_VIEW
,它是 getData()
在您的 Intent
- 对于
ACTION_SEND
,在 EXTRA_STREAM
extra 中查找 Uri
或在 EXTRA_TEXT
extra 中查找实际的 vCard 文本
我希望我的应用程序能够接收电子名片。通常来自电子邮件附件,但也来自文件等。不幸的是,它没有显示在 "Open with" / "Share with" 菜单中。
这是清单中的 activity 定义:
<activity
android:name=".MyMainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.BROWSABLE"/>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
<data android:scheme="http" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="https" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="content" android:host="*" android:pathPattern=".*\.vcf"/>
<data android:scheme="file" android:host="*" android:pathPattern=".*\.vcf"/>
</intent-filter>
</activity>
我的测试 vCard 电子邮件附件具有 .vcf
文件扩展名,并且电子邮件将 mimetype 标记为 text/vcard
。我使用了 *.*
mimetype 进行测试 - 显然这不适合生产代码。
上面的代码是从其他 Whosebug 问题、博客文章等中抄袭的。我最初是从以下内容开始的(两者的 mimetype 都是 text/vcard
,然后是 */*
:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
对于 Web URL 和大多数设备上的用途,这应该与 "Open With" 种类的选项一起使用:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/vcard" />
</intent-filter>
如果你也想支持"Share With",你可以试试:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/vcard" />
</intent-filter>
请注意,您获取内容的方式因这两个操作而异:
- 对于
ACTION_VIEW
,它是getData()
在您的Intent
- 对于
ACTION_SEND
,在EXTRA_STREAM
extra 中查找Uri
或在EXTRA_TEXT
extra 中查找实际的 vCard 文本