【问题标题】:Whatsapp like invite via sms implementation, just sms, not via intent chooserWhatsapp 喜欢通过短信实现邀请,只是短信,而不是通过意图选择器
【发布时间】:2015-11-05 08:35:38
【问题描述】:

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

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

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

我的应用有以下行为。

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

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

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

请看下面的参考图片 1.我的应用邀请 2. 在邀请时,发送短信

send sms, press back, check recent app list

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

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

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

请在下面找到代码sn-p

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. 查看最近的。

check in recent list

【问题讨论】:

标签: android android-intent android-5.0-lollipop google-app-invites


【解决方案1】:

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

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)

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

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2012-11-25
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多