[android] 短信发送器详解手机开发

/*****************2016年4月23日 更新********************************/

知乎:什么是 7 位元的字符? 英文字符难道不是 8 bit 是一个字符?一条短信到底能容下 140 个英文字符还是 160 个?

维基百科里「短信」词条如下定义「短信」:

一则短信能够容纳140字节,也就是约160个7位元的字符、或是140个8-bit的字符,中文字、韩文字与日文字这些占2-byte的字符则可容纳70个。(使用Unicode系统)。这些不包括额外的系统资讯。

还有我的手机怎么是最多 150 个英文字母?这是 7.5 位元的编码方式吗?

 

yskin

7位元字符就是指标准ASCII去掉最高位的0。以这种方式进行编码,在美国这样的国家,发送的短信字符都是ASCII码表里的,所以没必要浪费一个字位。

 

而短信协议支持7字位、8字位、16字位3种编码,7字位用于美国,可以发送160个字母,8字位用于欧洲国家,16字位用于中日韩俄等国家,使用UCS-2编码。而UCS-2把所有Unicode字符编码为2字节,所以即使英文字母也会编码成2个字节。

 

使用Windows Mobile 6系统做测试,新建短信后输入一个英文字母,下面显示1/160,再输入一个显示2/160,这就是7字位状态,可以在140字节里装下160个字符。当再输入一个汉字的时候,下面的显示立刻变成3/70,这就是16字位状态,每个字符都占2个字节,140字节只能装下70个字符,哪怕里面是69个英文字符加1个汉字。

 

如果短信超过长度,那么系统就自动分成多条短信来发。因为要加入一些标识性字符以表示顺序,所以英文每条153个,中文每条67个。接收方如果是新一点的手机就会把这几条合并后显示给用户,老一点的手机就会分别显示每条短信。

 

比如,输入70个中文,下面显示70/70,再加一个时下面显示“71/134(2短信息)”。输入160个英文,下面显示160/160,再加一个显示“161/306(2短信息)”。

 

使用139邮箱做测试,里面发送短信无论什么字符都是以UCS-2编码,当输入135个字符时,显示将按3条短信计费。另外,说明里还提到,最多只能支持350字的短信。

 

楼主提到的150字限制没听说过,英文Google没找到,中文Google只搜到09年时电信在测试150字符短信系统。

/*************************************************/

1. 拖动控件的话编译器自动加的layout_blow=”@+id/xxx” id那个部分没有+号
Ctrl+f批量替换
EditText显示的行数android:singleLine=”true”一行, android:lines=”5″ 多行
模拟器超时原因 电脑配置低,修改超时时间,模拟器socket挂了,重启一下
短信api SmsManager如果过时,导包的问题gsm 2G时代的,如果一个类无法new对象,那么它一定存在一个getDefaut或者getInstance的静态方法

2. SmsManager的方法
sendDataMessage(发送彩信)
sendMultipartTextMessage(发送多条信息),
sendTextMessage(目标手机, null(来源手机不支持), text, sentIntent, deliveryIntent)后两个参数,延迟报告和送达报告,不关心填null
需要这个权限 android.permission.SEND_SMS

短信都要最大长度的限制的,android提供了一个api用来拆分短信divideMessage(),返回ArrayList<String>,循环发送for(String str:contents){}

需要开启两个模拟器测试,电话号码就是端口号,此功能可以做出短信群发器

activity代码:

package com.tsh.sms; 
 
import java.util.ArrayList; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.telephony.SmsManager; 
import android.text.TextUtils; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 
 
public class MainActivity extends Activity implements OnClickListener { 
    private EditText et_number; 
    private EditText et_content; 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        Button bt_send=(Button) findViewById(R.id.bt_send); 
        et_number=(EditText) findViewById(R.id.et_number); 
        et_content=(EditText) findViewById(R.id.et_content); 
        bt_send.setOnClickListener(this); 
    } 
 
    @Override 
    public void onClick(View v) { 
        switch (v.getId()) { 
        case R.id.bt_send: 
            String number=et_number.getText().toString().trim(); 
            String content=et_content.getText().toString().trim(); 
            if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){ 
                Toast.makeText(this, "电话号码和内容都不能为空", Toast.LENGTH_SHORT).show(); 
                return; 
            } 
            SmsManager smsManager=SmsManager.getDefault(); 
            ArrayList<String> contents = smsManager.divideMessage(content); 
            for(String str:contents){ 
                smsManager.sendTextMessage(number, null, str, null, null); 
            } 
             
            break; 
        } 
    } 
}

 

layout代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.tsh.sms.MainActivity" > 
 
    <TextView 
        android:id="@+id/tv_input_number" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentTop="true" 
        android:text="@string/input_tel_number" /> 
 
    <EditText 
        android:id="@+id/et_number" 
        android:singleLine="true" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_below="@id/tv_input_number" 
        android:ems="10" 
        android:inputType="phone" > 
 
        <requestFocus /> 
    </EditText> 
 
    <TextView 
        android:id="@+id/tv_number" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_below="@id/et_number" 
        android:text="@string/sms_content" /> 
 
    <EditText 
        android:id="@+id/et_content" 
        android:lines="5" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_below="@id/tv_number" 
        android:ems="10" /> 
 
    <Button 
        android:id="@+id/bt_send" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_below="@id/et_content" 
        android:text="@string/send" /> 
 
</RelativeLayout>

 

divideMessage

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5513.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论