代码之家  ›  专栏  ›  技术社区  ›  winwaed

注册Android应用程序以接收某些文件类型

  •  2
  • winwaed  · 技术社区  · 7 年前

    我希望我的申请能够接收电子名片。通常来自电子邮件附件,也包括文件等。不幸的是,它不显示在“打开方式”/“共享方式”菜单中。

    这是清单中的活动定义:

         <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-显然,这不适用于生产代码。

    上面的代码是从其他stackoverflow问题、博客帖子等中筛选出来的。我最初从以下内容开始(两个都是mimetype 文本/ VCART 然后 */* :

            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   CommonsWare    7 年前

    对于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>
    

    如果您还想支持“分享”,您可以尝试:

        <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 额外的A Uri 或者在 EXTRA_TEXT 实际vCard文本的额外内容