You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何设置Android默认应用或让用户选择?各类应用Intent Filter配置

Hey Marvin, 很高兴能帮到你!我之前做过一批替代系统默认应用的项目,刚好整理过各个类型应用需要的AndroidManifest.xml配置,确保你的应用能被系统识别为可选择的默认应用。下面分类型给你详细说明:

相机应用(拍照)

要让你的应用被识别为可选的默认相机,需要配置两个核心的intent-filter:一个是应用的启动入口,另一个是处理拍照请求的入口:

<!-- 应用启动入口 -->
<activity android:name=".CameraActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- 处理拍照请求的intent-filter -->
    <intent-filter>
        <action android:name="android.intent.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

如果需要支持视频拍摄,可以额外添加android.intent.action.VIDEO_CAPTURE的action。

图库/相册应用(选择查看图片)

图库应用需要处理查看单张图片、选择图片以及获取图片内容的请求,对应的intent-filter配置如下:

<activity android:name=".GalleryActivity">
    <!-- 查看单张图片 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <!-- 选择图片(供其他应用调用选择) -->
    <intent-filter>
        <action android:name="android.intent.action.PICK" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <!-- 获取图片内容(支持文件选择) -->
    <intent-filter>
        <action android:name="android.intent.action.GET_CONTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

这些配置覆盖了大部分系统调用图库的场景,确保你的应用会出现在默认应用选择列表中。

联系人应用(查看、编辑、删除联系人及拨打电话)

联系人应用需要处理多种操作的intent,包括查看、编辑、删除、选择联系人,以及拨号请求:

<activity android:name=".ContactsActivity">
    <!-- 查看联系人列表/单个联系人 -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.dir/contact" />
        <data android:mimeType="vnd.android.cursor.item/contact" />
    </intent-filter>
    <!-- 编辑联系人 -->
    <intent-filter>
        <action android:name="android.intent.action.EDIT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/contact" />
    </intent-filter>
    <!-- 删除联系人 -->
    <intent-filter>
        <action android:name="android.intent.action.DELETE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/contact" />
    </intent-filter>
    <!-- 选择联系人(供其他应用调用选择) -->
    <intent-filter>
        <action android:name="android.intent.action.PICK" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.dir/contact" />
    </intent-filter>
    <!-- 拨号(打开拨号界面) -->
    <intent-filter>
        <action android:name="android.intent.action.DIAL" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

注意:删除联系人需要额外的权限android.permission.DELETE_CONTACTS,编辑和查看也需要对应的读写联系人权限。

电话应用(拨打/接听电话)

电话应用的核心是处理拨号、直接拨打以及接听请求,配置如下:

<activity android:name=".PhoneActivity">
    <!-- 打开拨号界面(无需额外权限) -->
    <intent-filter>
        <action android:name="android.intent.action.DIAL" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <!-- 直接拨打电话(需要android.permission.CALL_PHONE权限) -->
    <intent-filter>
        <action android:name="android.intent.action.CALL" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="tel" />
    </intent-filter>
</activity>

<!-- 接听电话需要注册Service,处理系统的来电请求 -->
<service android:name=".PhoneCallService"
         android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.ConnectionService" />
    </intent-filter>
</service>

另外,要成为默认电话应用,还需要在manifest中声明android.permission.MANAGE_OWN_CALLS权限,并且在代码中向系统申请成为默认电话应用的资格。

浏览器应用(浏览网页)

浏览器应用需要处理HTTP/HTTPS等网络链接的请求,关键是添加BROWSABLE category:

<activity android:name=".BrowserActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- 支持HTTP和HTTPS链接 -->
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>

如果需要支持其他协议(如FTP、file),可以在data标签中添加对应的scheme

键盘应用(文本输入)

键盘应用的配置和其他类型不同,它不是通过普通的activity intent-filter,而是需要注册输入法服务

<!-- 注册输入法服务 -->
<service android:name=".MyKeyboardService"
         android:permission="android.permission.BIND_INPUT_METHOD">
    <intent-filter>
        <action android:name="android.view.InputMethod" />
    </intent-filter>
    <!-- 关联输入法配置文件 -->
    <meta-data android:name="android.view.im"
               android:resource="@xml/keyboard_config" />
</service>

然后需要在res/xml/目录下创建keyboard_config.xml文件,配置输入法的基本信息:

<input-method xmlns:android="http://schemas.android.com/apk/res/android">
    <subtype android:label="@string/keyboard_name"
             android:imeSubtypeMode="keyboard"
             android:imeSubtypeLocale="en_US" />
    <!-- 可以添加更多语言的subtype -->
</input-method>

配置完成后,用户可以在系统设置的“语言和输入法”中选择你的键盘作为默认输入法。

启动器应用(主屏幕显示所有已装应用)

启动器应用的核心是添加HOME category,这样系统会把它识别为主屏幕选项:

<activity android:name=".LauncherActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

当用户按下home键时,系统会弹出选择框(如果有多个启动器),用户可以选择你的应用作为默认主屏幕。


关于默认设置的补充

你说得没错,从Android 5.0(API 21)开始,系统严格限制了非用户交互下设置默认应用的行为,必须由用户手动选择。不过只要你的应用配置了上述正确的intent-filter或服务,系统就会自动把它加入到对应的默认应用选择列表中,用户可以在系统设置里或者通过intent触发的选择对话框来设置默认。

内容的提问来源于stack exchange,提问作者Marvin Klar

火山引擎 最新活动