⑴ 如何判断android 短信发送是否成功
若使用的是vivo手机,未发送成功的短信,会显示红色感叹号,已发送成功的短信则不显示感叹号,还可以进入设置--应用与权限--系统应用设置--信息--打开短彩信送达报告,开启后已送达的短信前面显示箭头。
⑵ 安卓手机无法发送短信
安卓手机短信功能无法使用处理方法:1、换个信号良好的地区或时间段测试;2、查询SIM卡话费是否充足或者换张SIM卡尝试;3、进入【设置】-【信息】-【短信中心号码】,查看短信中心号码是否正确;4、进入【设置】-【更多设置】-【应用程序】-【全部】-【Android
System
WebView】,点击【卸载】或【更新】,然后重启手机后再试;5、进入手机【设置】-【更多设置】-【恢复出厂设置】-【还原所有设置】(不会删除手机任何数据)。若以上方式均尝试无效,建议联系手机官方售后处理。如需设置短信中心号码,可回复:XX手机短信中心号码设置方法(如:苹果手机短信中心号码设置方法/华为手机短信中心号码设置方法)。
⑶ android直接发送p编码后的短信
实现过程:
1>初始化:ATZ\r
2>设置文本模式:AT+CMGF=0\r(0:p模式,1:text模式)
3>设置PDU头:
typedef struct {
char SCA[16]; // 短消息服务中心号码(SMSC地址)
char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID; // 用户信息协议标识(TP-PID)
char TP_DCS; // 用户信息编码方式(TP-DCS)
char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[16]; // 原始用户信息
char index; //短消息序号,在读取时用到
}SM_PARAM;
// SMSC地址信息段
memset(buf, 0, sizeof(buf));
nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度
buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
buf[1] = 0x91; // 固定: 用国际格式号码
nDstLength = gsmBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
nDstLength += gsmInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC到目标PDU串
// TPDU段基本参数、目标地址等
memset(buf, 0, sizeof(buf));
nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
buf[1] = 0; // TP-MR=0
buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
buf[3] = 0x91; // 固定: 用国际格式号码
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
nDstLength += gsmInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
// TPDU段协议标识、编码方式、用户信息等
//nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
memset(buf, 0, sizeof(buf));
buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
buf[2] = 1; // 有效期(TP-VP)为5分钟
buf[3] = str2hex(user_p, pSrc->TP_UD); //用户信息的长度
nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4); // 转换该段数据到目标PDU串
strcat(p, "\x01a"); //以CTRL-A结束
gsmString2Bytes(p, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
4>发送信息长度:AT+CMGS=长度,这步重要长度不对是发不出去的。
5>发送用户信息
1、目前,发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。
1>使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;
2>使用PDU模式不仅支持中文短信,也能发送英文短信。
2、PDU模式收发短信可以使用3种编码:
1>7-bit(用于发送普通的ASCII字符,它将一串7-bit的字符(最高位为0)编码成8-bit的数据,每8个字符可 “压缩”成7个)
2>8-bit(通常用于发送数据消息,如:图片了,铃声等等)
3>UCS2编码(用于发送Unicode字符)
⑷ 在android中服务机制来做什么发短信为什么需要广播
Service,后台运行,可交互这样的一个东西。它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用。
什么时候需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总是藏在后头的。
Broadcast 实质就是(发送方)并不在意(接收方)接收到广播时如何处理。Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。
你要了解的是这个方法吧:public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
destinationAddress: 收件人地址
scAddress: 短信中心号码,null为默认中心号码
sentIntent: 当消息发出时,成功或者失败的信息报告通过PendingIntent来广播。如果该参数为空,则发信程序会被所有位置程序检查一遍,这样会导致发送时间延长。
deliveryIntent: 当消息发送到收件人时,该PendingIntent会被广播。p数据在状态报告的extended data ("p")中。
如果收件人或者信息为空则抛出 IllegalArgumentException 。
⑸ android 如何把彩信内容插入p表
给你提供点资料 做参考
在Android应用中读取彩信文件涉及到Android的一个数据库/data/data/com.android.providers.telephony/databases/mmssms.db和一个文件夹/data/data/com.android.providers.telephony/app_parts。要备份彩信,可以将这个数据库和文件夹拷贝到硬盘,但是在应用中却不能通过openDatabase系列方法来读这个数据库,也不能通过直接打开文件来读取附件文件,因为你的应用不是它们的所有者,不能直接读取,而要使用ContentProvider来读取。
1、读取mmssms.db数据库
彩信的标题、发送者号码、日期等数据存储在mmssms.db的p表中,要读取这个表可以使用系统提供的一个ContentProvider,URI是“content://mms”。操作这个ContentProvider和操作数据库一样,这个ContentProvider的结构也和p表的结构一样,Android文档对这些字段没有说明,但是可以通过将mmssms.db数据库备份到硬盘上,然后再通过Sqlite Database Browser软件来查看分析,具体可参考:blogjava.net。
content://mms主要的几个字段如下:
◆ _id:该条彩信的主键,对应着part表(ContentProvider的URI是content://mms/part,详见后)中的mid字段。
◆sub:该条彩信的标题
◆date:该条彩信的接收日期
下面的代码可以查询该CotnetProvider,得到一个cursor,并列出所有的列名。
Cursor cur = getContentResolver().query(Uri.parse("content://mms"),null, null, null, null);
String [] temp=cur.getColumnNames();
for (int i=0;i<temp.length;i++)
System.out.println(i+":"+temp);
通过上面的方法得到cursor后,就可以对这个cursor操作,并通过get方法得到_id,然后根据这个_id读取彩信附件文件。
2、读取彩信附件文件
彩信附件文件的地址存储在mmssms.db的part表的_data字段,形如“/data/data/com.android.providers.telephony/app_parts/PART_1262693697763”,但在应用中读取彩信附件时,这个字段基本没什么用,因为不能直接读取这个文件。读取同样要通过ContentProvider,URI为“content://mms/part”,该URI就是对应着part表。可以使用下列代码段来读取文件:
String selection = new String("mid='" + key + "'");//这个key就是p里面的_id。
Cursor cur = getContentResolver().query(Uri.parse("content://mms/part"), null, selection, null, null);
if (cur.moveToFirst())
do {
int _partID = cur.getInt(cur.getColumnIndex("_id"));
String partID = String.valueOf(_partID);
Uri partURI = Uri.parse("content://mms/part/" + partID);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;
try {
is = getContentResolver().openInputStream(partURI);
byte[] buffer = new byte[256];
int len = is.read(buffer);
while (len >= 0)
{
baos.write(buffer, 0, len);
len = is.read(buffer);
}
} catch (IOException e) {
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
}
这里得到的baos,就是附件文件。
3、声明permission
要在代码中使用content://mms,content://mms/part,content://sms等,还要在AndroidManifest.xml中注册premission,代码如下:
</application>
<uses-permission android:name="android.permission.READ_SMS" />