Android WebView 浏览器设置默认程序&清除默认设置

转载 2015年07月08日 11:09:29

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

1、检查是否已经设置了默认

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private void testGetDefaultActivity() {  
  2.     PackageManager pm = getPackageManager();  
  3.     Intent intent = new Intent(Intent.ACTION_VIEW);  
  4.     intent.setData(Uri.parse("http://www.google.com"));  
  5.     ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);  
  6.     Log.e(TAG, "getDefaultActivity info = " + info + ";pkgName = " + info.activityInfo.packageName);  
  7. }  

未设置默认log如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 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如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 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,则没有设置,否则,有默认的程序.

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public final boolean hasPreferredApplication(final Context context, final Intent intent) {  
  2.     PackageManager pm = context.getPackageManager();  
  3.     ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);  
  4.     return !"android".equals(info.activityInfo.packageName);  
  5. }  

如果有默认程序

我们需要做的是将现在的默认的程序的默认设置清除.

我们能通过代码直接将默认设置改写成我们的么,实际上是不行的,因为权限的问题. 原因是这样的Android因为基于Linux 内核,Linux有着很棒的用户概念,而Android中每个应用就是一个在Linux内核中的用户.两个级别相同的用户无法删除对方.

所以,我们只能交给用户手动做.当然这也是绝大多数程序的做法.你需要做的就是将使用者带到程序详情页,通过这段代码可以跳转到应用详情页.

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void testStartAppDetails() {  
  2.     //Use the destination package name  
  3.     Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.mx.browser"));  
  4.     getActivity().startActivity(intent);  
  5. }  

当跳转到已安装的应用详情页之后,你应该提示用处点击Clear Default 按钮.

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

注意,存在多次清理的情况,如设置浏览器,先清理了UC默认设置后,可能还需要清理海豚浏览器的情况.

没有默认的程序.

如果没有默认的程序,我们就需要设置我们希望的程序作为默认,但是,这页不能在代码中实现,还是需要人为的交互选择才可以.你需要做的就是使用类似如下代码,然后弹出一个提示,告诉用户选择你的程序作为默认的程序.至于提示语你可以充分发挥你的想象力.

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void testStartChooseDialog() {  
  2.     Intent intent = new Intent();  
  3.     intent.setAction("android.intent.action.VIEW");  
  4.     intent.addCategory("android.intent.category.BROWSABLE");  
  5.     intent.setData(Uri.parse("http://jb51.net"));  
  6.     intent.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity"));  
  7.     getActivity().startActivity(intent);  
  8. }  

取消自己的默认程序设置

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void testClearDefault() {  
  2.     PackageManager pm = mContext.getPackageManager();  
  3.     pm.clearPackagePreferredActivities(mContext.getPackageName());  
  4. }  

上述方法只能清理自己的默认设置

更近一步

实际上关于默认设置的配置文件存放在/data/system/packages.xml

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <preferred-activities>  
  2. <item name="com.mx.browser/.MxBrowserActivity" match="200000" set="2">  
  3. <set name="com.android.browser/.BrowserActivity" />  
  4. <set name="com.mx.browser/.MxBrowserActivity" />  
  5. <filter>  
  6. <action name="android.intent.action.VIEW" />  
  7. <cat name="android.intent.category.BROWSABLE" />  
  8. <cat name="android.intent.category.DEFAULT" />  
  9. <scheme name="http" />  
  10. </filter>  
  11. </item>  
  12. </preferred-activities>  

One More Thing

提问:当一个程序程序安装或卸载,系统会做什么

回答:当一个程序安装或者卸载,以浏览器为例子,如果你安装了一个傲游浏览器或者卸载了一个UC浏览器,当你从外部程序打开一个链接时,系统不会使用之前的默认程序打开,而是弹出一个选择对话框供你选择.

提问:什么时候系统会弹出选择打开程序列表

回答:经本人测试,实际是这样的,当有一个Intent过来的时候,系统会动态地收集能处理的Activity,然后从/data/system/packages.xml 读取进行比较,如果两者不同,则弹出选择对话框.

Android使用WebView的打开链接的方式(当前的WebView或者默认浏览器)

WebView布局文件:
  • stven_king
  • stven_king
  • 2014年07月15日 14:30
  • 7637

Android WebView不调用默认的 Browser

在自定义的 WebView 中打开链接时默认的是使用 Android 自带的Browser,如果需要自定义的 WebView 来处理打开的链接,需要重载载 WebViewClient.shouldOv...
  • panfengsoftware
  • panfengsoftware
  • 2012年07月29日 16:19
  • 928

android webview 运行时不调用系统自带浏览器

WebView mobView = new WebView(this); mobView.loadUrl("http://www.csdn.net"); WebSettings wSet = mo...
  • wulongtiantang
  • wulongtiantang
  • 2015年01月26日 00:16
  • 17939

Android webview控件(一) 使用webview开发浏览器实例

1.简介 在Android开发中,我们难免会使用到网页,而Android给我们提供了非常方便的加载网页的工具--Webview,其实webview在设计上就是独立的一个体系,虽然webview也是一...
  • wolfboy2
  • wolfboy2
  • 2017年09月14日 11:19
  • 464

Android 内置浏览器之webview

目录:         1.webview概述             2.webview常用方法         3.webview基本使用                 3.1 真的...
  • qq_28057577
  • qq_28057577
  • 2017年02月22日 13:20
  • 4133

修改WebView默认加载方式

今天在做webview加载Jquery Mobile开发的网页的时候出现了一个问题,使用WebView的LoadUrl()的方法 加载网页的时候不是在WebView显示已经加载的页面,而是在系统的 ...
  • mangguochang
  • mangguochang
  • 2015年12月14日 16:59
  • 766

Android WebView 详解

本文记录 Android 中 WebView 控件的相关使用,不断完善中…主要包括: 基本属性的配置 WebView 缓存相关内容 Java 与 Js 的交互 WebView 打开本地应用(支付宝等)...
  • chendong_
  • chendong_
  • 2017年07月15日 12:53
  • 575

Android WebView 浏览器设置默认程序&清除默认设置

以设置和清除默认浏览器为例。 1、检查是否已经设置了默认 [java] view plaincopy private void testGet...
  • a704755096
  • a704755096
  • 2015年07月08日 11:09
  • 1375

android设置默认程序&清除默认设置

以设置和清除默认浏览器为例。 1、检查是否已经设置了默认 private void testGetDefaultActivity() { PackageManager pm = get...
  • bzczceebdwq
  • bzczceebdwq
  • 2015年01月17日 14:58
  • 2094

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

以设置和清除默认浏览器为例。 1、检查是否已经设置了默认 [java] view plaincopy private void testGet...
  • lwyygydx
  • lwyygydx
  • 2015年01月19日 15:22
  • 10731
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android WebView 浏览器设置默认程序&清除默认设置
举报原因:
原因补充:

(最多只允许输入30个字)