[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
[android] 短信发送器的更多相关文章
- Android短信发送器(2)
在上一篇的<Android短信发送器>当中.发送功能并不完好.当发送内容超过限定字数时,短信就会发送失败,此时就须要推断内容是否超过限制,假设不超过限制.就直接发送,反之.则对其进行处理再 ...
- Android短信发送器_08
1.string xml代码 <?xml version="1.0" encoding="utf-8"?> <resources> &l ...
- 初识安卓小程序(Android短信发送器)
首先,先创建一个安卓项目(我的版本号是4.4.2的),名字为"短信发送器" 然后在res目录下找到layout目录,找到activity_main.xml或fragment_mai ...
- android短信发送器源代码
Activity类: import java.util.List;import android.app.Activity;import android.app.PendingIntent;import ...
- 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)
1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM ...
- Android实战--短信发送器
首先设计界面 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- android开发学习---开发一个简易的短信发送器
一.需求: 开发一个简易的短信发送器,输入:对方手机号码,短信内容,点击发送按钮,短信发送成功,对方手机成功收到短信. 其中要求短信内容过长时可以自动拆分,长度英文是160个英文,中文是70个,中英混 ...
- Android_简易的短信发送器
这个随笔将介绍如何完成一个简单的第三方的短信发送器(不打开短信界面,调用android的api完成功能) 1.首先,我们来做布局 由于我这里写的是一个简易的,,短信发送,所以只是一个LinearLay ...
- Android 短信的还原
上篇文章讲到<Android 短信的备份>,本文主要实现Android 短信的还原,即是将一条 布局文件: <RelativeLayout xmlns:android="h ...
随机推荐
- Unity3D Android手机开发环境配置,可真机发布调试
此方法配置好,在可以在unity直接发布到手机上,并可以实时调试. 1.配置eclipse环境:首先在官网下载安装包:http://developer.android.com/sdk/index.ht ...
- POJ 3345 Bribing FIPA 树形DP
题目链接: POJ 3345 Bribing FIPA 题意: 一个国家要参加一个国际组织, 需要n个国家投票, n个国家中有控制和被控制的关系, 形成了一颗树. 比如: 国家C被国家B控制, 国 ...
- Web离线存储的几种方式
随着HTML5的正式定稿,我们也可以大量使用HTML离线网络应用程序的特性. #1.Application Cache Application Cache 可以很简单让我们的WebApp具有离线的能力 ...
- 使用Html5+C#+微信 开发移动端游戏详细教程 总目录
(一).序(关于作者创业失败的感想) (二).准备工作&开发环境 (三).使用html5引擎搭建游戏框架 (四).游戏中层的概念与设计 (五).游戏图像的加载与操作 (六).游戏界面布局与性能 ...
- vs2010安装和使用
vs2010是之前我跟老师做网站项目时安装的,这次软件工程作业我就用它了,安装过程中的截图就不存在了,我就详细说说它的使用吧. VS2010软件挺大的,下载大概要一个多小时,安装过程大概都是下一步. ...
- Node.js 入门手册:那些最流行的 Web 开发框架
这篇文章与大家分享最流行的 Node.js Web 开发框架.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编 ...
- Android开发权威指南(第2版)新书发布
<Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...
- ADO.NET学习系列(四)---窗体版的登录小程序
1.需求分析:做一个登录的小程序,基于Winform的窗体小程序.基本要求:登录成功:弹框显示登录成功,登录失败就弹框显示失败. 扩展功能:登录次数超过3次,就”锁定“用户,提示登录错误次数过多,不能 ...
- Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计
在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司 ...
- javascript运算符的优先级
最基木的运算符优先级就是所谓的“先乘除,后加减”.对于优先顺序处于同一层次上的运算符,按照从左到右出现的顺序计算.下面给出javascript定义的所有运算符的优先级.运算符 优先顺序成员选择.括号. ...