以设置和清除默认浏览器为例。

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 nameIntent 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设置默认程序清除默认设置相关推荐

  1. python每天定时9点执行_win10设置Python程序定时运行(设置计划任务)

    楼主最近写了一个简单的Python程序,想让这个小程序每天上午8点定时运行一次,因为我的电脑是Windows系统,无法使用Linux下强大的crontab命令,所以我只好求助于度娘.我搜到了好几个相关 ...

  2. win10设置Python程序定时运行(设置计划任务)

    楼主最近写了一个简单的Python程序,想让这个小程序每天上午8点定时运行一次,因为我的电脑是Windows系统,无法使用Linux下强大的crontab命令,所以我只好求助于度娘.我搜到了好几个相关 ...

  3. java 设置其他程序焦点_设置焦点的问题

    设置焦点的问题 我做了个登陆界面,和QQ的登陆框相似,输入用户名的是JCombobox输入密码的是JPasswordText,我想当软件启动的时候,光标默认在密码输入框内,用了好多方法了都无效.希望高 ...

  4. win10如何设置某软件为系统默认程序(应用)?

    1. 电脑桌面左下角:开始--设置,进入Windows设置界面: 2. 在Windows设置界面进入应用(卸载/默认应用/可选功能): 3. 在应用界面左边菜单栏选择默认程序进入默认程序编辑窗口: 4 ...

  5. python程序设置_Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索"计划任务",并且点击打开" ...

  6. 「默认程序」Mac如何修改自带的默认程序

    型号:MacBook Pro M1/20款: 系统:macOSVentura13.0.1: 压缩软件 :BandiZip: 截图软件:i Shot Pro: 从macOSYosemite10.10.5 ...

  7. android盒子应用程序未安装,Android应用程序未安装怎么办 APK应用未安装解决办法...

    有许多安卓手机用户在安装手机APP应用时,Apk安装提醒"应用程序未安装"的情形,到底是怎么回事呢?下面通过这篇文章给人人先容一下应该怎么解决. 第一种:最普遍的解决方案 储存模式 ...

  8. android设置默认程序和清除默认设置

    以设置和清除默认浏览器为例. 1.检查是否已经设置了默认 [java]  view plain copy private void testGetDefaultActivity() { Package ...

  9. Android设置应用程序默认语言

    我们只要分三步来写此功能: 第一步: 写一个类(FunctionApplication)继承Application,在onCreate()方法中实现如下方法: @Override public  vo ...

最新文章

  1. mysql8 mac 忘记密码_mac下 MySql 8.0.15忘记密码重置密码
  2. 【个人随笔】准备整理整理以往的资料
  3. Segment Routing — SRv6 — 网络架构与应用场景
  4. 大数据处理平台与案例
  5. 达摩院2020十大科技趋势发布:科技浪潮新十年序幕开启
  6. vbs获取群聊当前内容_通过VBS脚本批量检测服务器状态 - 易本地工作室-Ebend SoftwareNetwork Studio - 群发,采集,管理类软件定制开发服务【易本地工作室】...
  7. 少了unicon-tools是不行滴
  8. 3dmax高版本转低版本插件_Fundebug前端JavaScript插件更新至1.8.0,兼容低版本的Android浏览器...
  9. 计算数字1至10的总和
  10. 关于优化云成本,你应该知道的事
  11. MySQL 数据库崩溃(crash)的常见原因和解决办法
  12. DNF检测原理分析篇
  13. 从网易博客转入CSDN
  14. Latex texstudio法国人名字上面的一撇,声调输入
  15. 在win10基础上安装Ubuntu16.04双系统(双硬盘)
  16. 产品读书《人人都是产品经理 1.0》
  17. C语言(二):数据类型
  18. vant框架的输入框在IOS上出现输入空格不显示,需要在输入字符才展示问题
  19. From scikit-learn to Spark ML
  20. 【K8S系列】第四讲:kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义

热门文章

  1. 如何用HTML写三级菜单
  2. Python excel xlwings+QT 考勤表开发 -【Python Office开发基础培训】 拆分合并文件
  3. excel中提取月份_在Excel中自动添加月份表
  4. linux pcap文件格式,pcap文件格式
  5. 杰理之人声消除【篇】
  6. 基于AntDesign UI的自定义表单
  7. 抢票软件真的靠谱吗?
  8. 蓝桥杯备赛经验分享---如何拿蓝桥国一?
  9. matlab编写关于离散的傅里叶变换
  10. 跟着团子学SAP PS—项目中的物料需求逻辑及导入程序设计要点(采购标识符/BAPI_NETWORK_COMP_ADD)