2014年12月24日 星期三

[Android] 透過程式碼清除預設值

在Android中有許多預設值,
像是預設的瀏覽器、信箱或是Home launcher等等。
通常要手動清除這些預設值會前往:
設定->應用程式->選定App->清除預設值

透過程式化最直覺的做法,
應該是使用clearPackagePreferredActivities函式,
只不過這只能用來清除自己App的設定值。

要清除別人的預設值,有一個小技巧,
例如要清除預設瀏覽器,首先先建立一個activity當作假的browser.
在AndroidManifest.xml中對FackActivity加入intent-filter

<activity
            android:name="com.example.safebrowsing.FackBrowser"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" /> 
                <category android:name="android.intent.category.BROWSABLE" />  
                <data android:scheme="http" />  
                <data android:scheme="https" />  

            </intent-filter>
</activity>

這是一般實作瀏覽器App會加入的intent-filter,
才會成為瀏覽器的選項之一。
要注意的是android:enabled="false"
先讓此activity失效。

接著在透過下列程式碼,達到清除瀏覽器預設值的效果。
public void onClickClearDefault(View view){
    String pn = MainActivity.class.getPackage().getName();
    String hn = FackBrowser.class.getName();
    ComponentName mhCN = new ComponentName(pn, hn); 
       
    pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        
    Uri uri = Uri.parse("http://");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
  
    pm.setComponentEnabledSetting(mhCN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

}
透過setComponentEnabledSetting讓FackBrowser啟用(Enabled),
隨後透過intent開啟一段網址,
再將FackBrowser停用(Disabled),
這時會跳出對話框,詢問使用者要使用哪一個瀏覽器開啟。
因為預設值已經被清除了。

至於為什麼這樣就能清除,
這可能需要看原始碼才能知道了。
感覺真像個bug.
清除其他預設值只要改一下intent-filter,
還有startActivity的intent加入對應的category.
就大功告成了。

沒有留言:

張貼留言