Android反編譯-揭秘獵豹設(shè)置默認瀏覽器邏輯

本文首發(fā)于 imesong的個人網(wǎng)站

設(shè)置默認瀏覽器是瀏覽器類軟件的基本功能之一张峰,通過設(shè)置默認瀏覽器瘾带,提高用戶主動打開自家產(chǎn)品的機會沟堡。但是由于國內(nèi)不同Rom差異很大悄谐,想要把這個功能做好介评,卻也不易。本文主要分享爬舰,如何通過競品分析的角度们陆,解決我們在開發(fā)過程中遇到的問題。

設(shè)置默認瀏覽器

設(shè)置默認瀏覽器的主要有兩大流派情屹,分別是官方提供法越軌提權(quán)法

UC瀏覽器提供的那種思路坪仇,沒有嘗試,主要覺得對權(quán)限要求太高垃你,兼容性無法保障椅文,需要對容錯有很多考慮颈墅。官方提供的方法中,原生Rom是沒有問題的雾袱,但是通過測試發(fā)現(xiàn)恤筛,現(xiàn)在的主流設(shè)備上,華為芹橡,三星毒坛,小米,樂視個別型號上都無法設(shè)置成功林说。通過分析競品煎殷,QQ,UC腿箩,獵豹都可以設(shè)置成功豪直。這個就引起了我的好奇,他們是如何做到的珠移,這里主要探索獵豹瀏覽器的做法弓乙。

設(shè)置默認瀏覽器流程

我們先來看下設(shè)置默認瀏覽器的流程圖

設(shè)置默認瀏覽器流程圖

在上面提到的兩篇文章中,也都是這個思路钧惧。關(guān)鍵點有三個暇韧。

判斷是否有默認瀏覽器

我們看獵豹,如果有設(shè)置默認瀏覽器浓瞪,他會使用一個ListView懈玻,把所有的默認瀏覽器的列出來。我們只需要找到初始化ListView的 Adapter乾颁,就可以拿到對應的方法涂乌。
SettingDefaultActivity 的 onResume 方法,我們定位到 ah.d(this);
我們看下具體的代碼英岭,雖然被混淆了湾盒,邏輯還是能夠清晰的看到。簡單還原下巴席,這段代碼就可以使用历涝。

public static ArrayList d(Context paramContext)
  {
    ArrayList localArrayList1 = new ArrayList();
    PackageManager localPackageManager = paramContext.getPackageManager();
    Intent localIntent = new Intent("android.intent.action.VIEW");
    localIntent.addCategory("android.intent.category.BROWSABLE");
    localIntent.setData(Uri.parse("http://bbs.liebao.cn"));
    try
    {
      List localList2 = localPackageManager.queryIntentActivities(localIntent, 0);
      localList1 = localList2;
      if (localList1 != null)
      {
        ArrayList localArrayList2 = new ArrayList();
        ArrayList localArrayList3 = new ArrayList();
        Iterator localIterator1 = localList1.iterator();
        while (localIterator1.hasNext())
        {
          ResolveInfo localResolveInfo = (ResolveInfo)localIterator1.next();
          localPackageManager.getPreferredActivities(localArrayList3, localArrayList2, localResolveInfo.activityInfo.packageName);
          Iterator localIterator2 = localArrayList3.iterator();
          while (localIterator2.hasNext())
          {
            IntentFilter localIntentFilter = (IntentFilter)localIterator2.next();
            if (((!localIntentFilter.hasCategory("android.intent.category.BROWSABLE")) && (!localIntentFilter.hasCategory("android.intent.category.DEFAULT"))) || (!localIntentFilter.hasDataScheme("http")))
              continue;
            localArrayList1.add(localResolveInfo);
          }
        }
      }
    }
    catch (Exception localException)
    {
      while (true)
      {
        String str = a;
        Object[] arrayOfObject = new Object[1];
        arrayOfObject[0] = localException.getMessage();
        ae.d(str, "queryIntentActivities Exception: %s", arrayOfObject);
        List localList1 = null;
      }
    }
    return localArrayList1;
  }


上面的這段代碼返回了當前手機上設(shè)置的默認瀏覽器诅需。如果為空漾唉,證明沒有設(shè)置默認瀏覽器,如果不為空堰塌,已經(jīng)把對應的包名赵刑,還有其他的信息都已經(jīng)保存起來了。

獲取默認瀏覽器的包名

由于我們已經(jīng)保存了所有的默認瀏覽器數(shù)據(jù)场刑,遍歷里面的數(shù)據(jù)就可以拿到默認瀏覽器的包名

/**
* 找到默認瀏覽器對應的包名
* 有可能會設(shè)置多個瀏覽器為默認瀏覽器般此,這里只考慮其中一個
*/
public static String findPackageNameOfDefaultBrowser(Context context) {
   Iterator iterator = getDefaultBrowserList(context).iterator();
   if (iterator.hasNext()) {
        ResolveInfo resolveInfo = (ResolveInfo) iterator.next();
        return resolveInfo != null ? resolveInfo.activityInfo.packageName : "";
    }
    return "";
}

清除默認瀏覽器

SettingDefaultBrowserActivity 中 蚪战,有個onClick 事件,是 清除按鈕的響應事件铐懊,找到下面的代碼

    /**
     * 啟動packageName對應的App的清除默認瀏覽器設(shè)置界面
     */
    public static void startAppInfoForPackageName(Activity activity, String packageName, int requestCode) {
        Intent intent = new Intent();
        intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        intent.setData(Uri.fromParts("package", packageName, null));
        activity.startActivityForResult(intent, requestCode);
    }

可以看到這里是發(fā)送一個Intent ,請求清除默認瀏覽器設(shè)置的頁面邀桑。

設(shè)置默認瀏覽器

    /**
     * 通知系統(tǒng)設(shè)置默認瀏覽器請求
     */
    public static void sendSetDefaultBrowserRequestIntent(Context context) {
        try {
            Intent localIntent = new Intent();
            localIntent.setAction("android.intent.action.VIEW");
            localIntent.putExtra("set_browser_congratulation", "set_browser_congratulation");
            localIntent.addCategory("android.intent.category.DEFAULT");
            localIntent.setData(Uri.parse(LANDING_URL));
            localIntent.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
            context.startActivity(localIntent);
        } catch (Exception e) {
           e.printException();
        }
    }

根據(jù)這個思路,我們基本上解決了設(shè)置默認瀏覽器的幾個關(guān)鍵問題科乎。經(jīng)過測試壁畸,在主流設(shè)備上都沒有問題。效果和QQ茅茂,UC捏萍,獵豹達到了同樣的效果。

參考資料

提升權(quán)限相關(guān)方法

通用的設(shè)置默認瀏覽器方法

設(shè)置默認應用程序原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空闲,一起剝皮案震驚了整個濱河市令杈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碴倾,老刑警劉巖逗噩,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跌榔,居然都是意外死亡给赞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門矫户,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片迅,“玉大人,你說我怎么就攤上這事皆辽「躺撸” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵驱闷,是天一觀的道長耻台。 經(jīng)常有香客問我,道長空另,這世上最難降的妖魔是什么盆耽? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扼菠,結(jié)果婚禮上摄杂,老公的妹妹穿的比我還像新娘。我一直安慰自己循榆,他們只是感情好析恢,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秧饮,像睡著了一般映挂。 火紅的嫁衣襯著肌膚如雪泽篮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天柑船,我揣著相機與錄音帽撑,去河邊找鬼。 笑死鞍时,一個胖子當著我的面吹牛油狂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寸癌,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼专筷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒸苇?” 一聲冷哼從身側(cè)響起磷蛹,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溪烤,沒想到半個月后味咳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡檬嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年槽驶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸳兽。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡掂铐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揍异,到底是詐尸還是另有隱情全陨,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布衷掷,位于F島的核電站辱姨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏戚嗅。R本人自食惡果不足惜雨涛,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懦胞。 院中可真熱鬧替久,春花似錦、人聲如沸医瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醇份。三九已至稼锅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僚纷,已是汗流浹背矩距。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怖竭,地道東北人锥债。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像痊臭,于是被迫代替她去往敵國和親哮肚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案广匙? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,728評論 1 92
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評論 25 707
  • 一鸦致、基礎(chǔ)知識篇:Http Header之User-AgentUser Agent中文名為用戶代理潮剪,是Http協(xié)議中...
    iPhone閱讀 15,647評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)分唾,斷路器抗碰,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 選擇門窗的基本要素!
    f7605bf6de39閱讀 189評論 0 0