在安卓中展示撰写短信界面

168

我想使用Android发送短信。

发送短信的意图是什么?

我想展示短信撰写视图,并且在信息字段中传递我的预定义文本。


1
你应该阅读这篇文章以获取完整的故事。 - Nguyen Minh Binh
我正在这里做类似的事情!!! https://dev59.com/j-o6XIcBkEYKwwoYORwV - Etienne Lawlor
@toobsco42: 不,你做的是完全相反的。你是在自己发送短信,而这个问题需要通过标准短信应用程序发送。 - Jan Hudec
您也可以支持双卡设备,参见此链接:https://dev59.com/LF4c5IYBdhLWcg3w9-J2#30677542 - Maher Abuthraa
本文简单介绍了Android上的SMS/MMS,并提供了发送和接收短信的简单代码示例:https://www.codeproject.com/Articles/1044639/Android-SMS-MMS-API-Sending-SMS-MMS-Receiving-SMS - Rou1997
我已经从这篇文章中删除了两个编辑,其中指出SmsManager是在API 19中添加的。我不知道API 19中发生了什么变化,也许在发送短信方面有一些重大的变化,但SmsManager肯定早于API 19。 - RenniePet
14个回答

201
你可以使用以下代码:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("sms:"
                        + phoneNumber)));

请确保将phoneNumber设置为您想要发送短信的电话号码。

您可以通过以下方式向SMS添加消息(来自评论):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));     
intent.putExtra("sms_body", message); 
startActivity(intent);

87
感谢您的代码。我想补充一点,因为我需要放入预定义的文本。我得到了这个解决方案:Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber)); intent.putExtra("sms_body", message); startActivity(intent); - djk
1
如何从联系人列表中设置“电话号码”? - Saeed M.
请问,有人知道这是否被记录在哪里了吗? - Jan Hudec
您可以使用以下代码发送短信:@Mr-Moqadampublic void sendsms(View view) { String phoneNumber = "+880xxxxxxxxxx"; String message = "欢迎使用短信"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber)); intent.putExtra("sms_body", message); startActivity(intent); } - Selim Raza
1
嗨,我想发送批量短信。像一次点击发送10,000条短信。这可能吗?我听说Android每30分钟发送30条短信。请帮帮我。 - Vrajesh
显示剩余3条评论

153

这对我起作用了。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
    btnSendSMS.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            sendSMS("5556", "Hi You got a message!");
           /*here i can send message to emulator 5556. In Real device 
            *you can change number*/
        }
    });
}

//Sends an SMS message to another device

private void sendSMS(String phoneNumber, String message) {
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
}

您可以在AndroidManifest.xml中添加这一行

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

看一下这个

对你可能有所帮助。


11
问题要求在标准撰写视图中显示短信。这恰恰相反,是在用户不知情的情况下发送短信,对吗? - Jan Hudec
如果信息中有撇号,它将无法发送消息。 - berserk

39

尝试以下代码,然后调用sendSMS("99999999999", "message");以发送所需号码的短信。

//---sends an SMS message to another device---
@SuppressWarnings("deprecation")
private void sendSMS(String phoneNumber, String message)
{        
    Log.v("phoneNumber",phoneNumber);
    Log.v("MEssage",message);
    PendingIntent pi = PendingIntent.getActivity(this, 0,
    new Intent(this, **DummyClasshere.class**), 0);                
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, pi, null);        
}

请将以下权限放置在 AndroidManifest.xml 文件中。

<uses-permission android:name="android.permission.SEND_SMS"/>
希望这能有所帮助。 更新 从评论中得知: DummyClasshere.class 是一个没有执行任何过程或需要导航的类。
你可以使用 Object.class 代替 DummyClasshere.class。

某物是一项不执行任何过程的活动。或者说,它是您需要导航的类。 - Senthil Mg
我只是使用 new Intent() 就可以了。 - Osmium USA
你如何知道短信是否已发送? - Ninja Coding

28

这肯定会起作用,在此情况下,发送消息而不使用任何意图。

SmsManager smsManager =     SmsManager.getDefault();
smsManager.sendTextMessage("Phone Number", null, "Message", null, null);

这段代码用于在后台发送消息(不显示消息编辑器),它也可以在广播接收器内部工作。如果您想从广播接收器发送消息。

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

1
+1。 对我的要求起作用了。但是我错过了一件事。这条消息没有出现在我的已发送项目中。为什么会这样? - Tahir
我们没有使用默认的Intent进程来发送短信,而是仅使用了Sms Manager。Intent将用于维护SmsManager的日志。 - Ashish Dwivedi
是的。这对我非常有用。但是发送短信后给出的确认消息意味着它可以更好。 - Gunaseelan
3
我建议在try-catch中添加此代码块。 - Tanveer Shaikh

10

7
我添加了我的短信方法,如果有帮助的话。请注意smsManager.sendTextMessage,如果文本太长,消息将无法发送。您必须根据编码尊重最大长度。更多信息请参见SMS Manager send mutlipart message when there is less than 160 characters
//随处可用
SMSUtils.sendSMS(context, phoneNumber, message);

//清单文件

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

 <receiver
     android:name=".SMSUtils"
     android:enabled="true"
     android:exported="true">
     <intent-filter>
         <action android:name="SMS_SENT"/>
         <action android:name="SMS_DELIVERED"/>
      </intent-filter>
 </receiver>

//JAVA

public class SMSUtils extends BroadcastReceiver {

    public static final String SENT_SMS_ACTION_NAME = "SMS_SENT";
    public static final String DELIVERED_SMS_ACTION_NAME = "SMS_DELIVERED";

    @Override
    public void onReceive(Context context, Intent intent) {
        //Detect l'envoie de sms
        if (intent.getAction().equals(SENT_SMS_ACTION_NAME)) {
            switch (getResultCode()) {
                case Activity.RESULT_OK: // Sms sent
                    Toast.makeText(context, context.getString(R.string.sms_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE: // generic failure
                    Toast.makeText(context, context.getString(R.string.sms_not_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE: // No service
                    Toast.makeText(context, context.getString(R.string.sms_not_send_no_service), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU: // null pdu
                    Toast.makeText(context, context.getString(R.string.sms_not_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF: //Radio off
                    Toast.makeText(context, context.getString(R.string.sms_not_send_no_radio), Toast.LENGTH_LONG).show();
                    break;
            }
        }
        //detect la reception d'un sms
        else if (intent.getAction().equals(DELIVERED_SMS_ACTION_NAME)) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Toast.makeText(context, context.getString(R.string.sms_receive), Toast.LENGTH_LONG).show();
                    break;
                case Activity.RESULT_CANCELED:
                    Toast.makeText(context, context.getString(R.string.sms_not_receive), Toast.LENGTH_LONG).show();
                    break;
            }
        }
    }

    /**
     * Test if device can send SMS
     * @param context
     * @return
     */
    public static boolean canSendSMS(Context context) {
        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
    }

    public static void sendSMS(final Context context, String phoneNumber, String message) {

        if (!canSendSMS(context)) {
            Toast.makeText(context, context.getString(R.string.cannot_send_sms), Toast.LENGTH_LONG).show();
            return;
        }

        PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, new Intent(SENT_SMS_ACTION_NAME), 0);
        PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED_SMS_ACTION_NAME), 0);

        final SMSUtils smsUtils = new SMSUtils();
        //register for sending and delivery
        context.registerReceiver(smsUtils, new IntentFilter(SMSUtils.SENT_SMS_ACTION_NAME));
        context.registerReceiver(smsUtils, new IntentFilter(DELIVERED_SMS_ACTION_NAME));

        SmsManager sms = SmsManager.getDefault();
        ArrayList<String> parts = sms.divideMessage(message);

        ArrayList<PendingIntent> sendList = new ArrayList<>();
        sendList.add(sentPI);

        ArrayList<PendingIntent> deliverList = new ArrayList<>();
        deliverList.add(deliveredPI);

        sms.sendMultipartTextMessage(phoneNumber, null, parts, sendList, deliverList);

        //we unsubscribed in 10 seconds 
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                context.unregisterReceiver(smsUtils);
            }
        }, 10000);

    }
}

5
String phoneNumber = "0123456789";
String message = "Hello World!";

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNumber, null, message, null, null);

请在您的AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.SEND_SMS" />

4

上面所解释的一些内容仅适用于将短信置于“准备启动”状态。 正如Senthil Mg所说,您可以使用短信管理器直接发送短信,但SMSManager已经移动到android.telephony.SmsManager

我知道这不是很多更多的信息,但它可能会帮助有需要的人。


问题明确要求不要自己发送短信。 - Jan Hudec

3
希望这可以帮到您...
文件名=MainActivity.java
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.inputmethod.InputMethodManager;
import android.widget.*;
import android.view.View.OnClickListener;
import android.view.*;


public class MainActivity extends Activity implements OnClickListener{


  Button click;
  EditText txt;
  TextView txtvw;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    click = (Button)findViewById(R.id.button);
    txt = (EditText)findViewById(R.id.editText);
    txtvw = (TextView)findViewById(R.id.textView1);

    click.setOnClickListener(this);
}

@Override
public void onClick(View v){


    txt.setText("");
    v = this.getCurrentFocus();

    try{
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage("8017891398",null,"Sent from Android",null,null);
    }
    catch(Exception e){
        txtvw.setText("Message not sent!");
    }
    if(v != null){
        InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(),0);
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

}

在 AndroidManifest.xml 中添加这行代码。

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

enter image description here


3

这可以通过现有应用程序发送文本消息。phoneNumber - 是字符串。如果您不想指定电话号码,请使用空字符串 ""。

Intent sendIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", phoneNumber, null));
sendIntent.putExtra("sms_body", "text message");
startActivity(sendIntent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接