簡體   English   中英

Android - 如何檢測用戶是否選擇使用意圖分享到Facebook或Twitter?

[英]Android - How do I detect if user has chosen to share to Facebook or twitter using intent?

我創建了一個分享到facebook,twitter等的應用程序。但是我想根據用戶共享的對象執行不同的功能 ,例如,如果用戶共享到Facebook做一件事但是如果用戶共享到twitter那么另一個。

我該怎么做呢?

我的代碼到目前為止如下:

private void ShareSub() {
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(
            Intent.EXTRA_TEXT,
            "You've just shared "
                    + "Awesome");
    startActivity(i);
}

以上代碼的進一步說明:

當用戶按下操作欄中的“ menu_item_share ”按鈕時,觸發上述功能。 然后,此功能會顯示如下圖所示的框,允許用戶選擇特定選項,例如Facebook或Twitter。 然后將Intent.EXTRA_TEXT共享給該特定應用程序。

我想要的是,當用戶點擊例如Facebook時,會調用特定的功能,例如通過他們的(Facebook的)api等進行共享。

在此輸入圖像描述

我沒有像下面這樣使用ShareActionProvider

   <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>

相反,我創建了一個調用ShareSub函數的簡單按鈕:

<item
    android:id="@+id/menu_item_share"
    android:icon="@android:drawable/ic_menu_share"
    android:showAsAction="ifRoom"
    android:title="Share"/>

我選擇這樣做的原因是,我不希望最近共享的按鈕出現,如下圖所示。 當我嘗試使用下面建議的代碼時,這會導致我出現問題,因為我沒有使用過ShareActionProvider

在此輸入圖像描述

您無法直接找到所選的應用程序,但您可以顯示自己的“選配器”對話框。

不要調用startActivity(i) ,而是使用queryIntentActivities()獲取已注冊處理您的意圖的所有活動(facebook,twitter等)的列表。

List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);

每個ResolveInfo都是一個可以處理您的意圖的應用程序。 現在,您可以顯示包含標簽或圖標列表的AlertDialog 當用戶從列表中選擇標簽時,您可以在對話框的單擊處理程序中處理特定於應用程序的操作。

編輯 :這是一個完整的工作示例

private void ShareSub() {
    final Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT,"text");

    final List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);

    List<String> appNames = new ArrayList<String>();
    for (ResolveInfo info : activities) {
        appNames.add(info.loadLabel(getPackageManager()).toString());
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Complete Action using...");
    builder.setItems(appNames.toArray(new CharSequence[appNames.size()]), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            ResolveInfo info = activities.get(item);
            if (info.activityInfo.packageName.equals("com.facebook.katana")) {
                // Facebook was chosen
            } else if (info.activityInfo.packageName.equals("com.twitter.android")) {
                // Twitter was chosen
            }

            // start the selected activity
            i.setPackage(info.activityInfo.packageName);
            startActivity(i);
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

使用按操作欄中的按鈕可觸發上述功能。

如果您使用的是ShareActionProvider ,則可以通過實現ShareActionProvider.OnShareTargetSelectedListener來檢測用戶何時從列表中選擇特定應用程序。 否則,除非您實施自己的活動選擇器,否則您將無法檢測選擇了哪個應用程序。

這是一個例子:

菜單

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>

</menu>

履行

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate your menu
    getMenuInflater().inflate(R.menu.share, menu);

    // The Intent you want to share
    final Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT, "Test");

    // Set up your ShareActionProvider
    final ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(
            R.id.your_share_item).getActionProvider();
    shareActionProvider.setShareIntent(i);
    shareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() {

        @Override
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            final String packageName = intent.getComponent().getPackageName();
            if (packageName.equals("com.facebook.katana")) {
                // Do something for Facebook
            } else if (packageName.equals("com.twitter.android")) {
                // Do something for Twitter
            }
            return false;
        }

    });
    return super.onCreateOptionsMenu(menu);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM