我创建了一个分享到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 。
答案 0 :(得分:19)
您无法直接找出所选择的应用,但您可以显示自己的“选择器”对话框。
不要致电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();
}
答案 1 :(得分:7)
使用按操作栏中的按钮可触发上述功能。
如果您使用了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);
}
答案 2 :(得分:1)
虽然这个问题有一个公认的答案,但事情已经发生了变化,现在有一个更好的方法,这是实现这一目标的推荐方法。
使用“Android 共享表”
文档如下: https://developer.android.com/training/sharing/send#share-interaction-data
在创建 IntentChooser 时,您可以传递一个待处理的意图,这将在您的应用内触发一个广播接收器。
该广播接收器的 onReceive 方法提供的数据将为您提供用于处理 SEND 意图的组件的名称。
用于向 SEND 意图添加待处理意图的代码:
Intent share = new Intent(ACTION_SEND);
...
PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode,
new Intent(myContext, MyBroadcastReceiver.class),
PendingIntent.FLAG_UPDATE_CURRENT);
share = Intent.createChooser(share, null, pi.getIntentSender());
用于检索用户选择的组件的详细信息的代码:
@Override public void onReceive(Context context, Intent intent) {
...
ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}
答案 3 :(得分:0)