所以我已经尝试了很长时间找到一种方法来创建一个可以在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, 0, sent, 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,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, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "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,但我不知道如何。我的想法是,我可以将“字符串消息”100除以数组,但我不知道。
所以请随意重构代码。我很期待看到你的回复! :d 请询问您是否需要更好的解释或更多代码! :)
答案 0 :(得分:1)
不是针对Android的,但请阅读“串联短信”标准。基本上它是多条消息,每条消息都指定它们与前一条消息一起使用,但它作为完全独立的SMS进行播出。
当然,大多数手机都会向用户隐瞒这一事实,但如果您直接接收短信,则可能需要自行处理 - 发送和接收。假设Android使用这个标准,这似乎是一个安全的赌注。
因为它很常见,所以我相信你可以找到一个已经写过的图书馆。
答案 1 :(得分:0)
您要求的所有内容都在GTalkSMS代码中(似乎您错过了它)。 :-)但我会指出你正确的片段。
为了使用sendMultipartTextMessage()
并区分不同的已发送/已发送通知意图,您首先需要通过SmsManager.divideMessage(message)
拆分消息字符串并创建两个,一个用于发送通知,另一个用于已发送的通知, PendingIntents ArrayLists,其中,,这是重要的部分,每个PendingIntent都必须使用唯一的请求int创建:
PendingIntent.getBroadcast(context, UNIQUE_ID, deliveredIntent, PendingIntent.FLAG_ONE_SHOT)
这可确保andoird将为每个已发送的通知广播唯一意图。您还可以为意图添加一些额外内容,稍后可以告诉您通知的SMS。
代码段可在此处找到:sendSMSByPhoneNumber()
确保您的SmsReceiver知道传入的意图可以包含多个发件人的一条SMS,但最多包含nbfOfpdus不同的发件人。 GTalkSMS接收器肯定会帮助您了解如何实现这一目标。 :)