`

android下发送中文短消息

阅读更多

android下发送中文短消息

 

在android中用直接使用smsManager.sendTextMessage()方法发送中文或其它unicode字符会显示不正确。

目前来说想正确发送中文,需要自己构造PDU,然后在JAVA中用反射调用SmsManager的private sendRawPdu方法来实现。

参考:http://www.android123.com.cn/androidkaifa/180.html

上文中只说了PDU构造实现原理,具体怎么使用没有涉及。俺这再补一把,直接贴出代码。其实android本身SDK就有相应方法以UCS2编码发送,只是默认不会调用。

以下代码G1下测试通过

public class SmsHelper {

public static final int MAX_USER_DATA_BYTES = 140;

private Context mContext;

public SmsHelper(Context c) {
mContext = c;
}

public void sendUnicodeMessage(String phone, String text) {

SmsManager smsManager = SmsManager.getDefault();

Class clazz = smsManager.getClass();

try {

Class[] types = new Class[4];
types[0] = byte[].class;
types[1] = byte[].class;
types[2] = Class.forName("android.app.PendingIntent");
types[3] = Class.forName("android.app.PendingIntent");

Object[] params = new Object[4];
params[0] = null;
params[1] = getSubmitPdu(null, phone, text).encodedMessage;
params[2] = PendingIntent
.getBroadcast(mContext, 0, new Intent(), 0);
// params[2] = null;
params[3] = null;

Method m = clazz.getDeclaredMethod("sendRawPdu", types);
m.setAccessible(true);
m.invoke(smsManager, params);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

public static SubmitPdu getSubmitPdu(String scAddress,
String destinationAddress, String message) {

if (message == null || destinationAddress == null) {
return null;
}

SubmitPdu ret = new SubmitPdu();

byte mtiByte = (byte) (0x01 | 0x00);

ByteArrayOutputStream bo = getSubmitPduHead(scAddress,
destinationAddress, mtiByte, false, ret);

byte[] userData, textPart;
// Encoding to the 7-bit alphabet failed. Let's see if we can
// send it as a UCS-2 encoded message

try {
textPart = message.getBytes("utf-16be");
} catch (UnsupportedEncodingException uex) {
uex.printStackTrace();
return null;
}

userData = textPart;

if (userData.length > MAX_USER_DATA_BYTES) {
// Message too long
return null;
}

// TP-Data-Coding-Scheme
// Class 3, UCS-2 encoding, uncompressed
bo.write(0x0b);

// (no TP-Validity-Period)

// TP-UDL
bo.write(userData.length);

bo.write(userData, 0, userData.length);

ret.encodedMessage = bo.toByteArray();

return ret;
}

private static ByteArrayOutputStream getSubmitPduHead(String scAddress,
String destinationAddress, byte mtiByte,
boolean statusReportRequested, SubmitPdu ret) {

ByteArrayOutputStream bo = new ByteArrayOutputStream(
MAX_USER_DATA_BYTES + 40);

// SMSC address with length octet, or 0
if (scAddress == null) {
ret.encodedScAddress = null;
} else {
ret.encodedScAddress = PhoneNumberUtils
.networkPortionToCalledPartyBCDWithLength(scAddress);
}

// TP-Message-Type-Indicator (and friends)
if (statusReportRequested) {
// Set TP-Status-Report-Request bit.
mtiByte |= 0x20;
}
bo.write(mtiByte);

// space for TP-Message-Reference
bo.write(0);

byte[] daBytes;

daBytes = PhoneNumberUtils
.networkPortionToCalledPartyBCD(destinationAddress);

// destination address length in BCD digits, ignoring TON byte and pad
// TODO Should be better.
bo.write((daBytes.length - 1) * 2
- ((daBytes[daBytes.length - 1] & 0xf0) == 0xf0 ? 1 : 0));

// destination address
bo.write(daBytes, 0, daBytes.length);

// TP-Protocol-Identifier
bo.write(0);

return bo;
}

}


 



分享到:
评论

相关推荐

    北斗短报文发送与接收,Android串口编程

    北斗短报文服务基于卫星通信技术,允许用户发送和接收短消息,通常长度在120个汉字以内。与传统的短信服务不同,北斗短报文服务不受地面基站的限制,可以覆盖全球范围。在Android设备上,需要特定的硬件模块,如北斗...

    最新andriod发送中文短信方法

    在Android平台上发送中文短信是一项常见的任务,特别是在开发与通信相关的应用程序时。然而,随着Android系统的更新,一些早期的方法可能不再适用。本篇文章将探讨在Android 1.6之后如何有效地发送包含中文字符的...

    Android NFC API Reference(官方,中文)

    NFC(近场通信)是一种短程无线技术,需要在 4 厘米或更短的距离下初始化连接。NFC 允许在 NFC 标签和 Android 设备之间或两个 Android 设备之间共享小数据量的负载。NFC 标签具有复杂的分类,简单的 NFC 标签只提供...

    Android高级编程(中文版)

    《Android高级编程》是一本专为想要深入理解Android开发的程序员设计的中文版教程。这本书旨在帮助读者掌握Android系统的高级特性和开发技巧,是Android入门者的理想读物。通过本书,开发者可以提升自己的技能,从...

    Android系列教程(二) Android手机必装软件

    2. **AnFetion**:这是中国移动推出的Android版飞信客户端,支持GPRS和WiFi连接,能够快速稳定地进行消息收发。AnFetion的界面设计与Symbian版飞信相似,操作简单直观。需要注意的是,目前版本还不支持飞信群组显示...

    百度android工程师面试题

    一条标准的短信息在中文环境下大约占70字节(包括标点符号),而在英文环境下则可达160字节。这一限制源于早期GSM标准的规定,对信息长度进行了标准化,以确保不同设备间的信息兼容性和传输效率。 #### 6. Android...

    Android_API中文帮助文档

    Android_API中文帮助文档是开发者在进行Android应用开发时的重要参考资料,它详尽地阐述了Android应用程序接口(API)的各种功能和用法。这份文档通常包括类库、方法、接口、枚举、注解等各类编程元素的说明,帮助...

    百度android面试题

    一条标准短信息的长度受制于GSM编码标准,中文短信息最长可达70字符(包括标点),英文短信息则为160字符。这一限制源于早期网络的带宽和处理能力,但随着技术进步,现代通信协议已能支持更长的信息长度。 #### 6. ...

    android测试题集锦(搜集自安卓巴士)

    4. **短信长度**:一条最长的短信息,英文为160个字符(或160个字节),中文通常为70个字符(包括标点),也是160个字节。 5. **内存回收**:在Java(包括Android)中,内存回收是由垃圾收集器自动完成的,程序员不...

    百度android开发面试题

    标准的短信息(SMS)长度限制为160个英文字符或70个中文字符(含标点符号),这是由于早期的GSM标准规定的限制。这一限制在现代智能手机中仍然存在,尽管现在可以通过多条短信拼接的方式发送更长的信息,但每条短信...

    电子政务-借助流动无线电网的短信息业务发送基本字元构成的亚洲文字.zip

    本资料“电子政务-借助流动无线电网的短信息业务发送基本字元构成的亚洲文字”着重探讨了如何利用移动通信技术,尤其是短信息服务(SMS),来传递和处理亚洲文字。 亚洲文字,包括汉字、日文、韩文等多种文字系统,...

    android面试

    - **中文短信息**:最多包含70个字符(包括标点符号),每个字符占用2个字节,总共140字节。 - **英文短信息**:最多包含160个字符,每个字符占用1个字节,总共160字节。 这是因为英文字母采用7位ASCII编码,而汉字...

    android 项目源码

    - Handler/Looper/Message机制,用于在主线程和工作线程之间发送消息,处理耗时操作。 - 使用IntentService在后台执行任务,自动管理生命周期,避免内存泄漏。 7. **权限管理** - Android应用需要在`...

    Android开发指南中文版

    ### Android开发指南中文版知识点详解 #### 应用程序基础 - Application Fundamentals 在Android开发过程中,理解应用程序的基础概念至关重要。这些基础知识不仅帮助开发者构建稳定可靠的应用程序,还能够优化性能...

    Android例子源码获取设备上的所有传感器信息并显示

    - `getMinDelay()`:获取传感器的最小报告延迟,即传感器可以在多短的时间间隔内发送事件。 步骤四:显示传感器信息 将获取到的传感器信息(如名称、类型、范围等)展示在UI上,可以使用ListView或者RecyclerView...

    Android面试题集

    - **Applications(应用程序层)**:这一层包含了Android平台自带的一系列核心应用程序,例如Email客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。这些应用程序都是使用Java语言编写的。 - **...

Global site tag (gtag.js) - Google Analytics