以编程方式发送短信而无需打开消息应用程序

82

到目前为止,我使用以下代码通过我的应用程序向另一部手机发送短信。

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

然而,这会打开本机短信应用程序,将我的应用程序活动置于后台。是否可能在不打开本机短信应用程序的情况下直接发送短信?如果可以,如何实现?


请查看此链接:https://dev59.com/YWsz5IYBdhLWcg3w2Llt - MysticMagicϡ
哦,伟大的踩票者,请告诉我为什么? :) - SoulRayder
可能是在Android中发送短信的重复问题。 - Shabbir Dhangot
2
这并没有明确提到本机消息应用程序打开的根本问题,尽管我同意两种解决方案都被提到了。对于那些需要直接发送短信的人来说,这可能是一个有用的材料,因为我已经明确强调了使用这两种方法所得到的结果的差异。 - SoulRayder
5个回答

138

您可以通过以下方式从您的应用程序发送消息:

public void sendSMS(String phoneNo, String msg) {
    try {      
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, msg, null, null);    
        Toast.makeText(getApplicationContext(), "Message Sent",
                Toast.LENGTH_LONG).show();
    } catch (Exception ex) {
        Toast.makeText(getApplicationContext(),ex.getMessage().toString(),
                Toast.LENGTH_LONG).show();
        ex.printStackTrace();
    } 
}

此外,在 AndroidManifest.xml 文件中需要授予 SEND_SMS 权限以发送短信。

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


9
这仅适用于API目标版本早于23的构建。 对于较新的构建,您需要跳过更多的障碍,因为Google已更改了像SEND_SMS这样的“危险”权限的工作方式。 唉。 - SMBiggs
5
请注意,如果您在Google Play上发布应用程序,这将违反政策并最终导致您的应用程序被暂停。 - MIKE PERETZ
2
@MIKEPERETZ是正确的,请查看此链接https://play.google.com/about/privacy-security-deception/permissions/。我收到了一封有关应用程序中使用短信相关权限的邮件。 - praveenb
5
这是一份旧答案,目前已违反Google Play政策,请不要使用上述代码。 - Himanshu Agarwal
5
目前,未经用户允许而访问通话记录或短信被视为违反政策,即使您的应用程序是默认的短信/通话记录处理程序也是如此。 - MIKE PERETZ
显示剩余8条评论

22
public void sendLongSMS() {
    String phoneNumber = "0123456789";
    String message = "Hello World! Now we are going to demonstrate " + 
        "how to send a message with more than 160 characters from your Android application.";
    SmsManager smsManager = SmsManager.getDefault();
    ArrayList<String> parts = smsManager.divideMessage(message); 
    smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
}

不要忘记添加

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

没有人提到短信消息的多部分重要概念,当它包含单字节或多字节字符时,会受到限制。非常感谢。 - Zonouzi

14
发送请求权限的短信:
在清单文件中添加:
在清单文件中添加:
<uses-permission android:name="android.permission.SEND_SMS" />

添加 Java 函数:

void sendSmsMsgFnc(String mblNumVar, String smsMsgVar)
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED)
    {
        try
        {
            SmsManager smsMgrVar = SmsManager.getDefault();
            smsMgrVar.sendTextMessage(mblNumVar, null, smsMsgVar, null, null);
            Toast.makeText(getApplicationContext(), "Message Sent",
                    Toast.LENGTH_LONG).show();
        }
        catch (Exception ErrVar)
        {
            Toast.makeText(getApplicationContext(),ErrVar.getMessage().toString(),
                    Toast.LENGTH_LONG).show();
            ErrVar.printStackTrace();
        }
    }
    else
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            requestPermissions(new String[]{Manifest.permission.SEND_SMS}, 10);
        }
    }

}

直到用户授权之前,此操作将忽略第一条消息(或者许多消息将被忽略,直到获得授权)。 - FindOutIslamNow

8

是的,我找到了自己问题的答案 :)

使用以下代码可以实现相同的功能:

 SmsManager sms = SmsManager.getDefault();
                     sms.sendTextMessage(srcNumber, null, message, null, null);

这需要在Android清单xml文件中声明以下权限。
  <uses-permission android:name="android.permission.SEND_SMS"/>

3
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, sms, null, null);

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