如何设置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




