2014-01-06 30 views
4

我需要爲特定MIME類型設置默認應用程序。我知道如何清除默認設置,但我需要在未打開應用程序的情況下提示用戶。提示默認活動而不實際打開活動

PackageManager p = mContext.getPackageManager(); 
ComponentName cN = new ComponentName(mContext, FakeDownloadActivity.class); 
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 

Intent selector = new Intent(Intent.ACTION_DEFAULT); 
selector.addCategory(Intent.CATEGORY_DEFAULT); 
selector.setType(mimeType); 
mContext.startActivity(selector); 

p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

上面的代碼啓動活動而不是隻選擇默認活動。它的作用是啓用假活動,然後禁用它。這會導致Select Default App對話框在下次調用時顯示。我只想僅選擇默認活動。

回答

6

你在找什麼是ACTION_PICK_ACTIVITY的意圖。

首先,您創建一個定義,應該是有資格選擇應用程序的意圖,例如:

Intent mainIntent = new Intent(Intent.ACTION_DEFAULT, null); 
mainIntent.addCategory(Intent.CATEGORY_DEFAULT); 

然後,您創建ACTION_PICK_ACTIVITY意圖,並作爲額外的,你傳遞的主要意圖你前

Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); 
pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent); 

現在創建的,你剛開始活動的結果與此意圖:

startActivityForResult(pickIntent, 0); 

在使用者可以選擇應用程序的位置創建一個對話框,但點擊該對話框後,活動不會啓動,而是保留在您的活動中,功能onActivityResult將與結果一起被調用。所以你需要創建該功能:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

       //In data, you have all the information about the selected application 
     if (data != null) { 
       //You can launch the application that we just picked with startActivity(data); 
       //or explore the variable to get all the information than you want 
     } 
    } 

看看Intent類。在那裏你可以獲得關於軟件包名稱和將要啓動的類的信息。

從現在起,您需要的是將該包和類設置爲意圖的默認值,或者您需要的任何其他值。壞的一面是,您只能爲了自己的內部目的而保存這些信息,例如決定下次用戶執行某些操作時要啓動的應用程序。你不能做的是修改系統設置,爲給定的意圖設置默認的活動。其實,the package manager has the addPreferredActivity方法,這是應該做到這一點,但由於API級別8中已被棄用,給這個原因:

這是一個受保護的API,它不應該是向第三方 第三方應用程序。平臺有責任分配 首選活動,並且不能直接修改。將新的 首選活動映射添加到系統。當 Context.startActivity()發現多個匹配活動並且 與給定過濾器匹配時,這將用於 自動選擇給定活動組件。

+0

Quote:'不好的一面是,你只能爲自己的內部目的保存該信息,例如決定什麼應用程序下次啓動,用戶執行某些操作。' - 這正是我我試圖避免。該解決方案需要爲給定的Intent設置Android的系統設置。 – Randy

+1

我猜你不會在沒有打開應用程序的情況下這樣做,因爲正如我所說的那樣,這樣做的功能已經在Froyo中棄用了,因爲Android團隊認爲應用程序會改變這一點,並且必須通過默認方式完成由系統創建並啓動picker。至少在這裏你有一個用戶選擇應用程序的對話框,你可以知道選擇了哪一個。這是我能想到的最好的。我害怕我什麼也做不了。 –

+0

這就是我所懷疑的,但我很欣賞這種努力。 – Randy