无法在我的应用程序堆栈中启动默认短信 Activity 。在 nexus 6 lollipop 和 android one marshmallow 中出现问题。
我尝试发送 ACTION_VIEW 的 Intent ,并设置 smsto: 和 sms body。
我能够启动短信应用程序。
我的应用有以下行为。
我的应用程序中有联系电话列表
当用户说邀请时,我想启动默认短信应用,填写短信正文和默认短信应用应该在我的 Activity 任务中。
按下后退键,我想关闭消息传递应用程序。
请看下面的引用图片 1.我的应用邀请 2. 收到邀请,发送短信
send sms, press back, check recent app list
我能达到什么。 我能够在 kitkat 中实现上述目标。 (默认短信应用程序完成) 但是,不是 Lollipop 和棉花糖。默认短信应用进入后台。
- 启动默认短信应用程序并填写数据。
- 按下后退键,消息应用程序进入后台。
- 现在我将能够从最近的应用程序列表中启动短信应用程序,这再次向收件人填充相同的号码和正文,这不是预期的。
问题是,应用程序是在新的 Activity 任务中启动的。我无法在我的 Activity 任务中获取该消息传递应用程序。如果我在该消息传递应用程序上按回键,我就可以返回到我的应用程序。但是,如果我从最近列表中选择消息应用程序,它每次都会显示短信收件人和正文填充 Activity 。
请在下面找到代码 fragment
private void sendTextMessage(String to)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // At least KitKat
{
String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(mActivity); // Need to change the build to API 19
Logger.log_error(TAG + "sendTextMessage() above KITKAT");
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra("address", to);
sendIntent.putExtra("sms_body", "sms body");
sendIntent.putExtra(Intent.EXTRA_TEXT, "sms body");
if (defaultSmsPackageName != null)// Can be null in case that there is no default, then the user would be able to choose
// any app that support this intent.
{
sendIntent.setPackage(defaultSmsPackageName);
Logger.log_error(TAG + "sendTextMessage() defaultSmsPackageName = " + defaultSmsPackageName);
}
getContext().startActivity(sendIntent);
}
else // For early versions, do what worked for you before.
{
Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
Logger.log_error(TAG + "sendTextMessage() below KITKAT");
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address", to);
smsIntent.putExtra("sms_body", getString(R.string.str_share_app_short_text));
startActivity(smsIntent);
}
}
这种启动方式会干扰消息传递应用程序。
我试过启动没有历史记录的 Intent ,单个实例,从最近的排除。
作为引用,我附上了 whatsapp 屏幕截图,我想在我的 Activity 中使用它。 我无法在堆栈溢出中发布超过 2 个链接,因此只保留最近的应用程序列表。
- 启动 whatsapp,转到联系人,向下滚动,寻找绿色邀请 并邀请。
- 它将启动短信应用程序。
- 检查最近。
最佳答案
我想,我找到了答案。可能不理想但有效。
private void shareEx() {
List<Intent> targetShareIntents=new ArrayList<Intent>();
PackageManager packageManager = getContext().getPackageManager();
Intent shareIntent=new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
List<ResolveInfo> resInfos= getContext().getPackageManager().queryIntentActivities(shareIntent, 0);
if(!resInfos.isEmpty()){
Logger.log_error( TAG + "sharenew Have package");
for(ResolveInfo resInfo : resInfos){
String packageName = resInfo.activityInfo.packageName;
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.setPackage(resInfo.activityInfo.parentActivityName);
//ignore list
if(packageName.contains("wifi") || packageName.contains("bluetooth") || packageName.contains("nfc") || packageName.contains("connect") || packageName.contains("memo") || packageName.contains("translate") || packageName.contains("gps")
|| packageName.contains("file") || packageName.contains("File") || packageName.contains("drive") || packageName.contains("office") || packageName.contains("docs") || packageName.contains("dropbox") || packageName.contains("beam")
|| packageName.contains("keep")) {
Logger.log_error( TAG + "sharenew IGNORE Package packageName = " + packageName);
continue;
}
Logger.log_error( TAG + "sharenew Package packageName = " + packageName);
if (packageName.contains("sms") || packageName.contains("mms") || packageName.contains("talk") || packageName.contains("messaging") || packageName.contains("twitter") || packageName.contains("com.facebook.orca")) {
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.str_share_app_short_text));
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.str_share_app_subject));
} else if(packageName.contains("whatsapp")) {
// dont add subject for whatsapp
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.str_share_app_long_text));
} else {
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.str_share_app_long_text));
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.str_share_app_subject));
}
targetShareIntents.add(new LabeledIntent(intent, packageName, resInfo.loadLabel(packageManager), resInfo.icon));
}
if(!targetShareIntents.isEmpty()){
Logger.log_error( TAG +"sharenew Have Intent");
Intent chooserIntent=Intent.createChooser(targetShareIntents.remove(0), "Choose app to share");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetShareIntents.toArray(new Parcelable[]{}));
startActivity(chooserIntent);
}else{
Logger.log_error( TAG +"sharenew nothing");
}
}
}
引用: How to filter specific apps for ACTION_SEND intent (and set a different text for each app)
我请求人们改进答案。谢谢。
关于android - Whatsapp 喜欢通过短信实现邀请,只是短信,而不是通过 Intent 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33539841/