问题描述
||
因此,我已经尝试了很长时间,以找到一种方法来制作可以在android中发送和接收短信的应用。很好这是代码:
发送:
@SuppressWarnings(\"deprecation\")
public void sendSMS(String phoneNumber,String message) {
String SENT = \"SMS_SENT\";
String DELIVERED = \"SMS_DELIVERED\";
int unq = 0;
Intent sent = new Intent(SENT);
sent.putExtra(\"unq\",unq);
Intent delivered = new Intent(DELIVERED);
delivered.putExtra(\"unq\",unq);
PendingIntent sentPI = PendingIntent.getbroadcast(this,sent,0);
PendingIntent deliveredPI = PendingIntent.getbroadcast(this,delivered,0);
// ---when the SMS has been sent---
registerReceiver(new broadcastReceiver() {
@Override
public void onReceive(Context arg0,Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),\"SMS sent\",Toast.LENGTH_SHORT).show();
smsstatus = \"0\";
smserror = \"noError\";
//sendSmsstatus();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(),\"Generic failure\",Toast.LENGTH_SHORT).show();
setSmsstatus(\"1\");
setSmserror(\"Generic failure\");
sendSmsstatus(\"Generic failure\");
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(),\"No service\",Toast.LENGTH_SHORT).show();
setSmsstatus(\"2\");
setSmserror(\"No service\");
sendSmsstatus(\"No service\");
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(),\"Null PDU\",Toast.LENGTH_SHORT).show();
setSmsstatus(\"3\");
setSmserror(\"Null PDU\");
sendSmsstatus(\"Null PDU\");
break;
case SmsManager.RESULT_ERROR_RAdio_OFF:
Toast.makeText(getBaseContext(),\"Radio off\",Toast.LENGTH_SHORT).show();
setSmsstatus(\"4\");
setSmserror(\"Radio off\");
sendSmsstatus(\"Radio off\");
break;
}
}
},new IntentFilter(SENT));
// ---when the SMS has been delivered---
registerReceiver(new broadcastReceiver() {
@Override
public void onReceive(Context arg0,\"SMS delivered\",Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(),\"SMS not delivered\",Toast.LENGTH_SHORT).show();
break;
}
}
},new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber,null,message,sentPI,deliveredPI);
}
接收:
public class SmsReceiver extends broadcastReceiver {
@SuppressWarnings(\"deprecation\")
@Override
public void onReceive(Context context,Intent intent) {
// ---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = \"\";
Object sms = \"\";
ArrayList<String> s = new ArrayList<String>();
Manager m = Factory.getInstance().getManager();
if (bundle != null) {
// ---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get(\"pdus\");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
str += \" SMS fra \" + msgs[i].getoriginatingAddress() + \"\\n\";
str += \" Besked: \";
str += msgs[i].getMessageBody().toString();
str += \"\\n\";
sms = \"SMS = \"+msgs[i].getoriginatingAddress()+\",\"+msgs[i].getMessageBody().toString();
s.add(msgs[i].getoriginatingAddress());
s.add(msgs[i].getMessageBody().toString());
}
// ---display the new SMS message---
Toast.makeText(context,str,Toast.LENGTH_LONG).show();
Manager.toastIt(context,str);
// Send the sms to the server
//Connection.send(new Transmit(\"SmsReceived\",s));
}
}
}
这很棒!
问题来了。是否可以重构我的代码以实现以下目标:
在我发送的短信上有一个唯一的标识符/标志,这样我就可以确保自己收到的短信状态。如您所见,我已经尝试在我的2个意图中添加额外的内容,也许这是正确的方法,但不仅现在我不该如何检查/接收/提取状态标志,而且还真的要检查/现在是“唯一”。
我可以审查短信真是太好了,但是当它超过160个字符时,只向我显示前160个字符。我已经看过GTalkSMS的工作方式,但是希望可以将我的代码重构一下:)
最后一个问题是上述2的混合。我无法发送超过160个字符的短信。我知道我必须使用sendMultipartTextMessage,但我不知道如何。我的想法是我可以将\“ String message \”分配给一个Array,但我不知道。
因此,请随时重构代码。我期待着您的回复! :D
请询问您是否需要更好的解释或更多代码! :)
解决方法
不是特定于Android的,而是阅读有关“连接的SMS”标准的信息。基本上,它是多条消息,每条消息都指定它们与上一条消息一起使用,但是它作为完全独立的SMS进行广播。
当然,大多数电话都会向用户隐藏这一事实,但是如果您直接接收SMS,则可能需要自己处理-发送和接收。假设Android使用此标准,这似乎是一个安全的选择。
由于它是如此普遍,因此我确定您可以找到已经有人编写的库。
http://en.wikipedia.org/wiki/Concatenated_SMS
, 您要求的所有内容都在GTalkSMS代码中(似乎您错过了它)。 :-)但是,我将为您指出正确的摘录。
为了使用
sendMultipartTextMessage()
并区分不同的已发送/已传递的通知意图,您首先需要通过ѭ3split拆分消息字符串,并创建两个,一个用于已发送的通知,一个用于已传递的通知,PendingIntents ArrayLists,其中,这是重要的部分,必须使用唯一的请求int创建每个PendingIntent:
PendingIntent.getBroadcast(context,UNIQUE_ID,deliveredIntent,PendingIntent.FLAG_ONE_SHOT)
这样可以确保andoird将为每个发送的传递的通知广播唯一的意图。您还可以在意图中添加一些其他功能,以便稍后可以告诉您通知所针对的SMS。
可以在此处找到代码段:sendSMSByPhoneNumber()
确保您的SmsReceiver知道传入的意图可以包含多个发件人的多个SMS,但最多包含nbfOfpdus个不同的发件人。 GTalkSMS接收器一定会帮助您了解如何进行此操作。 :)