android设置默认程序&清除默认设置
2015-01-17 14:58
225 查看
以设置和清除默认浏览器为例。
1、检查是否已经设置了默认
未设置默认log如下:
如果没有设置默认,将是com.android.internal.app.ResolverActivity,包名为android
设置了默认的话,log如下:
那么如何判断是否设置了默认的程序呢,上面的方法默认的ResolveInfo,如果info.activityInfo.packageName为android,则没有设置,否则,有默认的程序.
如果有默认程序
我们需要做的是将现在的默认的程序的默认设置清除.
我们能通过代码直接将默认设置改写成我们的么,实际上是不行的,因为权限的问题. 原因是这样的Android因为基于Linux 内核,Linux有着很棒的用户概念,而Android中每个应用就是一个在Linux内核中的用户.两个级别相同的用户无法删除对方.
所以,我们只能交给用户手动做.当然这也是绝大多数程序的做法.你需要做的就是将使用者带到程序详情页,通过这段代码可以跳转到应用详情页.
当跳转到已安装的应用详情页之后,你应该提示用处点击Clear Default 按钮.
如果用户从安装详情页回到你的程序,你需要检测是不是用户清理了默认的程序设置,判断依据还是是否有默认的程序设置,如果还有默认的,继续提示需要手动清理其他已设置的程序,直到用户彻底清理完成之后,然后按照下面的没有默认设置程序的情况处理.
注意,存在多次清理的情况,如设置浏览器,先清理了UC默认设置后,可能还需要清理海豚浏览器的情况.
没有默认的程序.
如果没有默认的程序,我们就需要设置我们希望的程序作为默认,但是,这页不能在代码中实现,还是需要人为的交互选择才可以.你需要做的就是使用类似如下代码,然后弹出一个提示,告诉用户选择你的程序作为默认的程序.至于提示语你可以充分发挥你的想象力.
取消自己的默认程序设置
上述方法只能清理自己的默认设置
更近一步
实际上关于默认设置的配置文件存放在/data/system/packages.xml
One More Thing
提问:当一个程序程序安装或卸载,系统会做什么
回答:当一个程序安装或者卸载,以浏览器为例子,如果你安装了一个傲游浏览器或者卸载了一个UC浏览器,当你从外部程序打开一个链接时,系统不会使用之前的默认程序打开,而是弹出一个选择对话框供你选择.
提问:什么时候系统会弹出选择打开程序列表
回答:经本人测试,实际是这样的,当有一个Intent过来的时候,系统会动态地收集能处理的Activity,然后从/data/system/packages.xml 读取进行比较,如果两者不同,则弹出选择对话框.
1、检查是否已经设置了默认
private void testGetDefaultActivity() { PackageManager pm = getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); Log.e(TAG, "getDefaultActivity info = " + info + ";pkgName = " + info.activityInfo.packageName); }
未设置默认log如下:
I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410e4868 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0};pkgName = android
如果没有设置默认,将是com.android.internal.app.ResolverActivity,包名为android
设置了默认的话,log如下:
I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410ae1e8 com.mx.browser.MxBrowserActivity p=0 o=0 m=0x208000};pkgName = com.mx.browser
那么如何判断是否设置了默认的程序呢,上面的方法默认的ResolveInfo,如果info.activityInfo.packageName为android,则没有设置,否则,有默认的程序.
public final boolean hasPreferredApplication(final Context context, final Intent intent) { PackageManager pm = context.getPackageManager(); ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); return !"android".equals(info.activityInfo.packageName); }
如果有默认程序
我们需要做的是将现在的默认的程序的默认设置清除.
我们能通过代码直接将默认设置改写成我们的么,实际上是不行的,因为权限的问题. 原因是这样的Android因为基于Linux 内核,Linux有着很棒的用户概念,而Android中每个应用就是一个在Linux内核中的用户.两个级别相同的用户无法删除对方.
所以,我们只能交给用户手动做.当然这也是绝大多数程序的做法.你需要做的就是将使用者带到程序详情页,通过这段代码可以跳转到应用详情页.
public void testStartAppDetails() { //Use the destination package name Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.mx.browser")); getActivity().startActivity(intent); }
当跳转到已安装的应用详情页之后,你应该提示用处点击Clear Default 按钮.
如果用户从安装详情页回到你的程序,你需要检测是不是用户清理了默认的程序设置,判断依据还是是否有默认的程序设置,如果还有默认的,继续提示需要手动清理其他已设置的程序,直到用户彻底清理完成之后,然后按照下面的没有默认设置程序的情况处理.
注意,存在多次清理的情况,如设置浏览器,先清理了UC默认设置后,可能还需要清理海豚浏览器的情况.
没有默认的程序.
如果没有默认的程序,我们就需要设置我们希望的程序作为默认,但是,这页不能在代码中实现,还是需要人为的交互选择才可以.你需要做的就是使用类似如下代码,然后弹出一个提示,告诉用户选择你的程序作为默认的程序.至于提示语你可以充分发挥你的想象力.
public void testStartChooseDialog() { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.BROWSABLE"); intent.setData(Uri.parse("http://jb51.net")); intent.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity")); getActivity().startActivity(intent); }
取消自己的默认程序设置
public void testClearDefault() { PackageManager pm = mContext.getPackageManager(); pm.clearPackagePreferredActivities(mContext.getPackageName()); }
上述方法只能清理自己的默认设置
更近一步
实际上关于默认设置的配置文件存放在/data/system/packages.xml
<preferred-activities> <item name="com.mx.browser/.MxBrowserActivity" match="200000" set="2"> <set name="com.android.browser/.BrowserActivity" /> <set name="com.mx.browser/.MxBrowserActivity" /> <filter> <action name="android.intent.action.VIEW" /> <cat name="android.intent.category.BROWSABLE" /> <cat name="android.intent.category.DEFAULT" /> <scheme name="http" /> </filter> </item> </preferred-activities>
One More Thing
提问:当一个程序程序安装或卸载,系统会做什么
回答:当一个程序安装或者卸载,以浏览器为例子,如果你安装了一个傲游浏览器或者卸载了一个UC浏览器,当你从外部程序打开一个链接时,系统不会使用之前的默认程序打开,而是弹出一个选择对话框供你选择.
提问:什么时候系统会弹出选择打开程序列表
回答:经本人测试,实际是这样的,当有一个Intent过来的时候,系统会动态地收集能处理的Activity,然后从/data/system/packages.xml 读取进行比较,如果两者不同,则弹出选择对话框.
相关文章推荐
- Android WebView 浏览器设置默认程序&清除默认设置
- 在VS.net(C#)里,设置程序在启动时默认"以管理员身份运行"的方法
- Android eclipse 运行项目设置程序默认安装到SD卡
- 我的Android进阶之旅------>Android系统设置默认来电铃声、闹钟铃声、通知铃声
- android 设置将程序默认安装到sdcard
- 在Android 2.2上设置程序默认安装SD卡
- Android eclipse 运行项目设置程序默认安装到SD卡
- C#记事本作为.txt的默认程序 && vs设置图标
- 把自己的应用设置关联为android系统默认打开程序
- Android中检查、设置默认程序详解
- Android 设置 Setting --->开发者选项 中选项为默认配置(by liukun321咕唧咕唧)
- android设置默认程序
- Android eclipse 运行项目设置程序默认安装到SD卡
- 在Android 2.2上设置程序默认安装SD卡
- android设置默认程序和清除默认设置
- android 双SD卡切换(SD SWAP) 方案,如何恢复“设置->存储->默认存储器”的用户选择功
- 在Android 2.2上设置程序默认安装SD卡
- 在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)
- 如何将自己的程序设置为默认浏览器
- C#(VB.NET)操作Windows自带的防火墙 之 还原默认设置、阻止程序通知