当前位置: 首页 > 知识库问答 >
问题:

短信管理器发送多部分消息时,有少于160个字符

阙佐
2023-03-14

我写了一个使用短信管理器的应用程序。我使用方法sendTextMessage(),但它不起作用。现在我使用的是sendMutlipartTextMessage(),这很有用。但当大约60个字符时,它会发送多部分消息。这正常吗?我读到的每一个地方都应该有160个字符。这对我很重要,因为我必须付出更多。

共有2个答案

靳举
2023-03-14

我添加我的短信方法,如果它可以帮助某人。

//在任何地方使用

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);

    }
}
易流觞
2023-03-14

消息字符限制取决于您使用的字母表的字符位大小。对于标准GSM 7位字母表,字符限制为160。对于8位字母表,它是140个字符,而对于16位字母表,听起来像你的情况,它只有70个字符。如果你必须发送带有特殊Unicode字符的消息,比如非拉丁字母表中的字符,那么你就只能使用16位字母表,以及70个字符的限制。如果你能以某种方式将信息转换为基本的7位字母表,你将有160个字符的限制。

 类似资料:
  • 我提供以下代码,以便发送多部分短信,并检查是否送达,以回复发送方: ExecuteCommand是接收传入短信并最终回复发送方一条短信的BroadCastReciver 和类proivde用于发送意图,以确定发送和传递的状态为: } 最后短信正确接收但发送回复短信我认为这是由发送收件人动态寄存器接收引起的

  • 从跟踪中,我可以看到生产者在连接名称列表中有我的两个活动/备用主机,但也有“localhost”作为host_name和1414作为端口,这是我不能连接到它的原因吗?

  • 我有一个windows应用程序发送短信连接到GSM调制解调器。我只使用AT命令连接到端口和发送文本。 下面是ExecCommand方法

  • 我读过很多关于发送短信和多部分短信的帖子,如: 在Android系统中发送短信,在Android系统中发送和接收短信和彩信(pre-Kit Kat Android 4.4),Android系统PendingEvent extras,BroadcastReceiver未接收 ... 但他们似乎没有检查消息的所有部分是否成功发送。 据我所知,对于多部分消息,您可以为每个消息部分添加一个PendingE

  • 主要内容:本节引言:,1.调用系统发送短信功能:,2.调用系统提供的短信接口发送短信,本节小结:本节引言: 本节带来的是Android中的SmsManager(短息管理器),见名知意,就是用来管理手机短信的, 而该类的应用场景并不多,一般是我们发短信的时候才会用到这个API,当然这种短信是 文字短信,对于彩信过于复杂,而且在QQ微信各种社交APP横行的年代,你会去发1块钱一条的 彩信吗?所以本节我们只讨论发送普通文字短信! 官方文档:SmsManager 1.调用系统发送短信功能: 就是把写