[英]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.