Android WebView 瀏覽器設置默認程序&清除默認設置

以設置和清除默認瀏覽器爲例。

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 讀取進行比較,如果兩者不同,則彈出選擇對話框.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章