服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中检查、设置默认程序详解

Android中检查、设置默认程序详解

2021-03-12 15:50Android开发网 Android

这篇文章主要介绍了Android中检查、设置默认程序详解,本文讲解了检测是否有默认的程序、如果有默认程序、没有默认的程序的情况等内容,需要的朋友可以参考下

android作为一个伟大的系统,自然提供了设置默认打开程序的实现.在这篇文章中,我会介绍如何在android系统中设置默认的程序. 在设置默认程序之前,无非有两种情况,一种是已经有默认的程序,另一种则是没有任何默认程序.

检测是否有默认的程序

检查是必须的,因为结果关乎着我们下一步该怎么做.

复制代码 代码如下:

public void testgetdefaultactivity() {
    packagemanager pm = mcontext.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.i(view_log_tag, "getdefaultactivity info = " + info + ";pkgname = " + info.activityinfo.packagename);
}

 

其对应的日志输出如下

 

复制代码 代码如下:


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,那么这个resolveractivity是什么呢,其实它就是一个选择打开程序的对话框,其庐山真面目应该是这样

Android中检查、设置默认程序详解

如果我们设置了傲游浏览器作为我们的默认浏览器,那么默认的程序就应该显示关于傲游浏览器相关的信息. 如下.

 

复制代码 代码如下:

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 按钮.

Android中检查、设置默认程序详解
如果用户从安装详情页回到你的程序,你需要检测是不是用户清理了默认的程序设置,判断依据还是是否有默认的程序设置,如果还有默认的,继续提示需要手动清理其他已设置的程序,直到用户彻底清理完成之后,然后按照下面的没有默认设置程序的情况处理.

注意,存在多次清理的情况,如设置浏览器,先清理了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 读取进行比较,如果两者不同,则弹出选择对话框.

延伸 · 阅读

精彩推荐