Whatsapp喜欢通过短信实现邀请,只是短信,而不是通过意图选择器

时间:2015-11-05 08:35:39

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

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

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

我可以启动短信应用程序。

我的应用有以下行为。

  1. 我的应用

  2. 中有联系电话号码列表
  3. 当用户说邀请时,我想启动默认的短信应用程序,填写和短信正文,默认的短信应用程序应该在我的活动任务中。

  4. 在按下时,我想关闭消息传递应用程序。

  5. 请参阅下面的参考图片 1.我的应用邀请 2. on invite,发布短信

    send sms, press back, check recent app list

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

    1. 启动默认短信应用并填写数据。
    2. 在按下时,消息传递应用程序转到后台。
    3. 现在,我将能够从最近的应用程序列表中启动短信应用程序,该应用程序列表再次填充具有相同号码和正文的收件人,这不是预期的。
    4. 问题是,app是在新的活动任务中启动的。我无法在我的活动任务中获得该消息传递应用程序。如果我按回该消息传递应用程序,我可以回到我的应用程序。但是如果我从最近的列表中选择消息传递应用程序,它每次都会显示短信收件人和正文填充的活动。

      请找到下面的代码段

      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. 它将启动sms app。
      3. 检查最近。
      4. check in recent list

1 个答案:

答案 0 :(得分: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");
        } 
    } 
}

参考: How to filter specific apps for ACTION_SEND intent (and set a different text for each app)

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

相关问题