5

無法在我的應用程序堆棧中啓動默認的短信活動。問題見於nexus 6棒棒糖和android一款棉花糖。Whatsapp喜歡通過短信實現邀請,只是短信,而不是通過意向選擇器

我試圖發送ACTION_VIEW的意圖,並設置smsto:和短信體。

我可以啓動短信應用程序。

我有我的應用程序的以下行爲。

  1. 我在我的應用程序聯繫號碼列表

  2. 當用戶說邀請,我想啓動默認的短信應用,填寫並短信身體和默認的短信應用應該是在我的活動任務。

  3. 在逼人退,我要關閉消息應用程序。

請參考下面 1.參考圖像我的應用程序邀請 2.邀請,推出短信

send sms, press back, check recent app list

我能做到什麼。 我能夠在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. 檢查最近。

check in recent list

+0

我建議你看看https://fabric.io/kits/android/branch和https://firebase.google.com/docs/invites/android以獲得更好的跟蹤。 –

回答

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)

我要求大家提高答案。謝謝。