5

无法在我的应用程序堆栈中启动默认短信活动。在 nexus 6 lollipop 和 android one marshmallow 中看到的问题。

我试图发送 ACTION_VIEW 的意图,并设置 smsto: 和 sms 正文。

我能够启动短信应用程序。

我的应用程序有以下行为。

  1. 我的应用中有联系电话列表

  2. 当用户说邀请时,我想启动默认短信应用程序,填写短信正文和默认短信应用程序应该在我的活动任务中。

  3. 按下后,我想关闭消息应用程序。

请参阅下面的参考图片 1. 我的应用邀请 2. 在邀请时,启动短信

发送短信,按返回,查看最近的应用列表

我能达到什么。我能够在 kitkat 中实现上述目标。(默认短信应用程序完成)但是,不在棒棒糖和棉花糖中。默认短信应用程序进入后台。

  1. 启动默认短信应用程序并填写数据。
  2. 按下后,消息应用程序进入后台。
  3. 现在我将能够从最近的应用程序列表中启动短信应用程序,它再次用相同的号码和正文填充收件人,这不是故意的。

问题是,应用程序是在新的活动任务中启动的。我无法在我的活动任务中获取该消息传递应用程序。如果我按回那个消息应用程序,我就可以回到我的应用程序。但是,如果我从最近的列表中选择消息应用程序,它每次都会显示短信收件人和正文填充活动。

请在下面找到代码片段

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);
    }
}

这种启动方式会干扰消息传递应用程序。

我尝试过启动没有历史记录、单个实例、从最近排除的意图。

作为参考,我附上了我试图在我的活动中使用的 whatsapp 屏幕截图。我无法在堆栈溢出中发布超过 2 个链接,因此仅保留最近的应用程序列表。

  1. 启动whatsapp,转到联系人,向下滚动,寻找绿色邀请并邀请。
  2. 它将启动短信应用程序。
  3. 检查最近。

查看最近的列表

4

1 回答 1

7

我想,我找到了答案。可能不理想但有效。

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");
        } 
    } 
}

参考: 如何为 ACTION_SEND 意图过滤特定的应用程序(并为每个应用程序设置不同的文本)

我要求人们改进答案。谢谢。

于 2015-11-12T14:51:37.737 回答