2011-12-02 65 views
3

目前我有一個非常標準的ACTION_SEND意圖從我的應用程序內共享信息。代碼類似於下面的是:在Android上捕獲和攔截ACTION_SEND意圖

Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("text/plain"); 
    intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    intent.putExtra(Intent.EXTRA_TEXT, text); 
    context.startActivity(Intent.createChooser(intent, title)); 

現在,如果用戶安裝了手機上的Facebook應用程序,那麼Facebook顯示爲爲選擇器意圖的選項。但是,我想攔截用戶點擊「Facebook」並使用Facebook SDK執行任務,而不是已經在用戶手機上的Facebook應用程序。有沒有辦法攔截Facebook的onClick選項?謝謝!

回答

7

這裏是一個鏈接到我的博客文章與詳細的解決方案,包括代碼和屏幕截圖。

http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/

如從該文章援引:

[W]ë首先創建一個新ACTION_SEND意圖和類型設置爲文本 /純。接下來,我們創建一個List。我們打電話給包 經理查詢所有註冊的action_send意圖 的活動。此調用會退回ResolveInfo對象列表,每個對象都與設備上聲明處理髮送 操作的活動對應的 。

[隨後,R]比粥啓動ACTION_SEND意圖,並讓它 創建自己的對話框(一個我們會有無法控制),我們將 建立我們自己與AlertDialog.Builder。首先,我們給它一個 標題,然後將其適配器,我們只是 活動列表作爲我們的數據集創建的列表適配器[。]

我們需要看看下一個重要的一塊是的OnClick聽衆我們 給了Builder。要找到用戶點擊的項目,我們使用adapter.getItem(int which)方法。這將返回我們原始列表的 位置中的對象,在這種情況下,將返回對應於所選活動的ResolveInfo對象 。特別是我的情況,我 只關心把事情分成兩組:Facebook而不是Facebook。要做到這一點,我只需檢查所選活動的 包名是否包含'臉譜'。如果沒有,我創建一個新的 action_send intent,將類名設置爲選定的活動,然後 啓動它。然而,如果包名稱包含'臉譜',我 實例化我的個人PostToFacebookDialog對象,它將創建一個帶有發佈和取消按鈕的基本Android對話框,並直接使用Graph API發佈到 Facebook,從而規避用戶的 安裝Facebook應用程序。

+0

@亞歷山大盧卡斯,你不能改變列表的功能。我鼓勵你閱讀我的文章,瞭解如何做到這一點。 badhairday,我的文章實現了您要求的確切功能幷包含代碼。如果您有任何疑問,請回過頭看看我。 – italianmike

+0

+1 Thx幫了很大忙 – 66CLSjY

1

如果您在自己的應用程序中內置了一些功能以發佈到Facebook,那麼沒有理由創建選擇器並讓用戶首先選擇外部應用程序。也就是說,如果您使用SDK並且在您自己的應用程序中內置了一些功能來執行此操作,那麼請不要離開應用程序。只需創建一個意圖火到一個特定的類,像這樣:

Intent intent = new Intent(this.getActivity(), YourPostingActivity.class); 
...// Add stuff 
startActivity(intent); 

這不是真的有可能修改選擇器中的鏈接至Facebook(更不用提,用戶體驗較差攔截他們的企圖來處理與他們選擇的應用程序行動)。也就是說,如果您在自己的應用中註冊相關活動作爲ACTION_SEND意圖的接收者,它將顯示在列表中,用戶將可以選擇您的應用而不是原生Facebook應用。

+0

但是如果我想保留通過彩信,電子郵件和用戶在手機上安裝的任何其他東西的能力。 – mhenry

+0

答案更新:) –

+0

註冊我自己的應用程序作爲ACTION_SEND意圖的接收方的問題是官方的Facebook應用程序仍然會在列表中顯示。我不希望發生這種情況。 – mhenry