Android IntentChooser-不同应用的不同意图
我找到了答案,它解释了如何为每个应用程序创建不同的意图,但也解释了为什么它不起作用: 这是重现问题的代码,您甚至可以在Android IntentChooser-不同应用的不同意图,android,android-intent,Android,Android Intent,我找到了答案,它解释了如何为每个应用程序创建不同的意图,但也解释了为什么它不起作用: 这是重现问题的代码,您甚至可以在if中对进行注释,您将获得文本而不是twitter public Intent getShareChooserIntent(Context context) { Intent basicIntent = new Intent(); basicIntent.setAction(Intent.ACTION_SEND); basicIntent.setType(
if
中对进行注释,您将获得文本而不是twitter
public Intent getShareChooserIntent(Context context) {
Intent basicIntent = new Intent();
basicIntent.setAction(Intent.ACTION_SEND);
basicIntent.setType("text/plain");
basicIntent.putExtra(Intent.EXTRA_TEXT, "text");
basicIntent.putExtra(Intent.EXTRA_SUBJECT, "subject");
PackageManager pm = context.getPackageManager();
Intent openInChooser = Intent.createChooser(basicIntent, "share");
List<ResolveInfo> resInfo = pm.queryIntentActivities(basicIntent, 0);
List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
for (int i = 0; i < resInfo.size(); i++) {
ResolveInfo ri = resInfo.get(i);
String packageName = ri.activityInfo.packageName;
Intent realIntent = new Intent();
realIntent.setAction(Intent.ACTION_SEND);
realIntent.setType("text/plain");
realIntent.putExtra(Intent.EXTRA_TEXT, "text");
realIntent.putExtra(Intent.EXTRA_SUBJECT, "subject");
if (packageName.contains("twitter")) // !!!!THIS LINE!!!!
realIntent.putExtra(Intent.EXTRA_TEXT, "twitter");
intentList.add(new LabeledIntent(realIntent, packageName, ri.loadLabel(pm), ri.icon));
}
openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray( new LabeledIntent[ intentList.size()]));
return openInChooser;
}
public Intent获取共享选择内容(上下文){
意向基本内容=新意向();
基本内容设置动作(意图动作发送);
基本内容设置类型(“文本/普通”);
基本内容putExtra(Intent.EXTRA_TEXT,“TEXT”);
基本内容putExtra(Intent.EXTRA_SUBJECT,“SUBJECT”);
PackageManager pm=context.getPackageManager();
Intent openInChooser=Intent.createChooser(基本内容,“共享”);
List resInfo=pm.querytentActivities(基本内容,0);
List intentList=new ArrayList();
对于(int i=0;i
我做错了什么 不确定getShareBasicIntent做什么,但这段代码对我来说很好(在使用和不使用twitter的情况下都进行了检查)
静态公共意图GetShareChooseContent(上下文){
PackageManager pm=context.getPackageManager();
//请注意,此目的仅适用于电子邮件
//避免列表中出现重复项
意向emailIntent=新意向(Intent.ACTION\u SEND);
emailIntent.setType(“文本/普通”);
emailIntent.putExtra(Intent.EXTRA_文本,“非twitter”);
emailIntent.putExtra(Intent.EXTRA_SUBJECT,“SUBJECT”);
emailIntent.setType(“message/rfc822”);
Intent openInChooser=Intent.createChooser(emailIntent,“共享”);
//用于查询可支持的所有活动的基本意图
//文本共享
意向基本内容=新意向();
基本内容设置动作(意图动作发送);
基本内容设置类型(“文本/普通”);
List resInfo=pm.querytentActivities(基本内容,0);
List intentList=new ArrayList();
对于(int i=0;i
您能否发布getShareBasicIntent()的实现?
完成。。刚刚复制了源代码哦,我现在看到了我的问题,我忘记了setComponent
和setPackage
,它们在这里很重要。请注意,您的答案会创建一个重复的列表,其中一个是与基本意图匹配的所有应用程序,第二个是您在列表中创建的意图。为了避免此类行为,您可以将创建第一个列表的意图传递到intent.createChooser
和Email only intent,然后添加自定义意图。将在修复后获得批准
static public Intent getShareChooserIntent(Context context) {
PackageManager pm = context.getPackageManager();
// Note that this intent should only be for email
// to avoid duplicates in the list
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_TEXT, "not twitter");
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
emailIntent.setType("message/rfc822");
Intent openInChooser = Intent.createChooser(emailIntent, "share");
// the basic intent used to query all the activities that can support
// text sharing
Intent basicIntent = new Intent();
basicIntent.setAction(Intent.ACTION_SEND);
basicIntent.setType("text/plain");
List<ResolveInfo> resInfo = pm.queryIntentActivities(basicIntent, 0);
List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
for (int i = 0; i < resInfo.size(); i++) {
ResolveInfo ri = resInfo.get(i);
String packageName = ri.activityInfo.packageName;
Intent intent=new Intent();
intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "not twitter");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.setPackage(packageName);
if (packageName.contains("twitter")) {
intent.putExtra(Intent.EXTRA_TEXT, "twitter");
}
intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
}
openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray( new LabeledIntent[ intentList.size()]));
return openInChooser;
}