【问题标题】:Can i automatically send SMS (Without the user need to approve)我可以自动发送短信吗(无需用户批准)
【发布时间】:2011-11-29 00:39:33
【问题描述】:

我对 Android 比较陌生。 我试图从 Android 应用程序发送短信。 使用 SMS Intent 时,SMS 窗口打开,用户需要批准 SMS 并发送。

有没有办法在没有用户确认的情况下自动发送短信?

谢谢, 利奥

【问题讨论】:

    标签: android android-activity sms


    【解决方案1】:

    您可以使用此方法发送短信。如果短信大于 160 个字符,则使用 sendMultipartTextMessage。

    private void sendSms(String phonenumber,String message, boolean isBinary)
    {
        SmsManager manager = SmsManager.getDefault();
    
        PendingIntent piSend = PendingIntent.getBroadcast(this, 0, new Intent(SMS_SENT), 0);
        PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(SMS_DELIVERED), 0);
    
        if(isBinary)
        {
                byte[] data = new byte[message.length()];
    
                for(int index=0; index<message.length() && index < MAX_SMS_MESSAGE_LENGTH; ++index)
                {
                        data[index] = (byte)message.charAt(index);
                }
    
                manager.sendDataMessage(phonenumber, null, (short) SMS_PORT, data,piSend, piDelivered);
        }
        else
        {
                int length = message.length();
    
                if(length > MAX_SMS_MESSAGE_LENGTH)
                {
                        ArrayList<String> messagelist = manager.divideMessage(message);
    
                        manager.sendMultipartTextMessage(phonenumber, null, messagelist, null, null);
                }
                else
                {
                        manager.sendTextMessage(phonenumber, null, message, piSend, piDelivered);
                }
        }
    }
    

    更新

    piSend 和 piDelivered 是 Pending Intent 可以在方法发送完短信后触发广播

    这是广播接收器的示例代码

        private BroadcastReceiver receiver = new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String message = null;
    
                switch (getResultCode()) {
                case Activity.RESULT_OK:
                    message = "Message sent!";
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    message = "Error. Message not sent.";
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    message = "Error: No service.";
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    message = "Error: Null PDU.";
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    message = "Error: Radio off.";
                    break;
                }
    
                AppMsg.makeText(SendMessagesWindow.this, message,
                        AppMsg.STYLE_CONFIRM).setLayoutGravity(Gravity.BOTTOM)
                        .show();
          }
      };
    

    您可以在 Activity 中使用以下行进行注册

    registerReceiver(receiver, new IntentFilter(SMS_SENT));  // SMS_SENT is a constant
    

    别忘了在 onDestroy 中注销广播

    @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }
    

    【讨论】:

    • 在双卡手机中,在双卡设置(android 常规设置)中的首选 SIM 卡设置中为用户选择要发送消息的 SIM 卡。是否可以选择 sim 使用什么来发送短信(程序化)?
    • @AndrésRicardoTorresMartínez Android 不支持双卡。它得到了设备制造商的支持,他们编写了自己的 API 来支持双卡。所以请咨询设备制造商。
    • 如何查看消息是否发送成功?发送文本后,它会显示在我的短信应用程序上吗?另外,如果我想发送到多个电话号码怎么办?
    • 所以调用sendSMS 函数并在其正下方从main 添加registerReceiver(receiver, new IntentFilter(SMS_SENT));?你是什​​么意思SMS_SENT 是恒定的?我还可以进行递归,如果消息发送失败,每小时重试一次吗?谢谢你:)
    • 是调用 sendSMS 函数并在其下方添加 registerReceiver(receiver, new IntentFilter(SMS_SENT));如果您想每小时发送一次短信,您可以使用AlaramManager 类。您可以多次调用此方法:)。 SMS_SENT 表示它只是一个常量,例如 private static final String SMS_SENT = "my.app";
    【解决方案2】:

    如果您的应用在 AndroidManifest.xml 中具有以下权限

    <uses-permission android:name="android.permission.SEND_SMS"/>
    

    您可以发送任意数量的短信

    SmsManager manager = SmsManager.getDefault();
    manager.sendTextMessage(...);
    

    仅此而已。

    【讨论】:

      【解决方案3】:

      是的,您可以使用SmsManager 发送短信。请记住,您的应用程序需要SEND_SMS 权限才能运行。

      【讨论】:

        【解决方案4】:

        是的,您可以在不进行用户交互的情况下发送短信......但是当用户只想向单个号码发送短信时,它可以工作。

        try {    
            SmsManager.getDefault().sendTextMessage(RecipientNumber, null,    
            "Hello SMS!", null, null);    
        } catch (Exception e) {    
            AlertDialog.Builder alertDialogBuilder = new    
            AlertDialog.Builder(this);    
            AlertDialog dialog = alertDialogBuilder.create();    
            dialog.setMessage(e.getMessage());    
            dialog.show();    
        }    
        

        另外,添加清单权限....

        <uses-permission android:name="android.permission.SEND_SMS"/>
        

        【讨论】:

          【解决方案5】:
          //sent sms
          private void sendSMS(String phoneNumber, String message) {
              String SENT = "SMS_SENT";
              String DELIVERED = "SMS_DELIVERED";
          
              PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
              PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
          
              // ---when the SMS has been sent---
              registerReceiver(new BroadcastReceiver() {
                  @Override
                  public void onReceive(Context arg0, Intent arg1) {
          
                      switch (getResultCode()) {
          
                          case Activity.RESULT_OK:
          
                              Toast.makeText(getBaseContext(), "SMS sent",
                                      Toast.LENGTH_SHORT).show();
                              break;
          
                          case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
          
                              Toast.makeText(getBaseContext(), "Generic failure",
                                      Toast.LENGTH_SHORT).show();
                              break;
          
                          case SmsManager.RESULT_ERROR_NO_SERVICE:
          
                              Toast.makeText(getBaseContext(), "No service",
                                      Toast.LENGTH_SHORT).show();
                              break;
          
                          case SmsManager.RESULT_ERROR_NULL_PDU:
          
                              Toast.makeText(getBaseContext(), "Null PDU",
                                      Toast.LENGTH_SHORT).show();
                              break;
          
                          case SmsManager.RESULT_ERROR_RADIO_OFF:
          
                              Toast.makeText(getBaseContext(), "Radio off",
                                      Toast.LENGTH_SHORT).show();
                              break;
                      }
                  }
              }, new IntentFilter(SENT));
          
              // ---when the SMS has been delivered---
              registerReceiver(new BroadcastReceiver() {
                  @Override
                  public void onReceive(Context arg0, Intent arg1) {
          
                      switch (getResultCode()) {
          
                          case Activity.RESULT_OK:
          
                              Toast.makeText(getBaseContext(), "SMS delivered",
                                      Toast.LENGTH_SHORT).show();
                              break;
          
                          case Activity.RESULT_CANCELED:
          
                              Toast.makeText(getBaseContext(), "SMS not delivered",
                                      Toast.LENGTH_SHORT).show();
                              break;
                      }
                  }
              }, new IntentFilter(DELIVERED));
          
              SmsManager sms = SmsManager.getDefault();
              sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
          }
          

          你可以使用这个完整的功能

          【讨论】:

            猜你喜欢
            • 2012-07-09
            • 1970-01-01
            • 2017-01-30
            • 1970-01-01
            • 2011-10-30
            • 1970-01-01
            • 2022-06-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多