我正在开发Android项目,我需要发送短信。我的应用通过使用网络服务收集所需信息,此信息非常短且纯文本。此信息将以SMS的形式发送。
我使用广播接收器来跟踪SMS是否成功发送,只需添加日志条目。我使用 SmsManager 来发送短信。
我的设备具有非常好的WiFi强度和良好的GPRS网络。在发送短信时,我发现广播接收器插入了日志条目,一些用于“成功”,一些用于“通用故障”。
为什么很少有短信因“通用故障”而失败?这背后的原因是什么?
我用谷歌搜索,发现有些人说要关掉WiFi。但是对于消费网络服务,我需要WiFi ON。
任何人都可以对此有所了解吗?有没有解决这个问题的方法?
答案 0 :(得分:3)
如果你一起发送很多短信,它会淹没你的手机,所以最好有一些延迟。
接下来,如果你确实有延迟,你必须看到它没有在UI线程中完成,否则你将获得ANR。
尝试使用处理程序,我的朋友建议这一点,我试过,它运行正常。
至于通用问题,我不确定......名称Generic让它听起来像是一个正常的网络错误。
希望这些信息有用。
答案 1 :(得分:2)
我已经在时间延迟的帮助下克服了这个通用的失败消息,将一个设备发送到多个号码,它几乎消除了一般故障
for(int index=0; index < phone.length; index++){
phonenumber=phone[index];
Toast.makeText(cxt, "Phone number is: "+phonenumber, Toast.LENGTH_LONG).show();
if(index==0){
Send_SMS(phonenumber.toString().trim(), textmessage);
}
else{
new Handler().postDelayed(new Runnable() {
public void run() {
Send_SMS(phonenumber.toString().trim(), textmessage);
}
}, 1000*40);
}
}
public void Send_SMS(String phonenumber, String message){
// here you use sms manager to send the sms
}
答案 2 :(得分:0)
在AndroidManifest文件中添加此权限
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
答案 3 :(得分:0)
试试这个:
String [] cellArray = phNumbers.getText().toString().split(";");
mMessageSentCount = 0;
String cellno = cellArray[mMessageSentCount].toString().trim();
startSendMessages(cellno);
private void startSendMessages(String ph){
registerBroadCastReceivers();
sendSMS(ph, mBody);
}
private void sendNextMessage(int mMessageSentCount){
String ph = cellArray[mMessageSentCount].toString().trim();
sendSMS(ph, mBody);
}
private boolean thereAreSmsToSend(){
return mMessageSentCount < cellArray.length;
}
private void sendSMS(final String phoneNumber, String message) {
Toast.makeText(getBaseContext(), "Phone number is: "+phoneNumber, Toast.LENGTH_SHORT).show();
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
SmsManager sms = SmsManager.getDefault();
ArrayList<String> parts = sms.divideMessage(message);
mMessageSentTotalParts = parts.size();
Log.i("Message Count", "Message Count: " + mMessageSentTotalParts);
ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
for (int j = 0; j < mMessageSentTotalParts; j++) {
sentIntents.add(sentPI);
deliveryIntents.add(deliveredPI);
}
mMessageSentParts = 0;
sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents);
}
private void registerBroadCastReceivers(){
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
mMessageSentParts++;
if ( mMessageSentParts == mMessageSentTotalParts ) {
mMessageSentCount++;
if(thereAreSmsToSend()){
sendNextMessage(mMessageSentCount);
} else{
Toast.makeText(getBaseContext(), "All SMS have been sent",Toast.LENGTH_SHORT).show();
}
}
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
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));
}
答案 4 :(得分:0)
我遇到过类似的问题。几分钟后,我发现我尝试发送的电话号码无效。
因此,任何人都有这个问题,请先查看电话号码!
答案 5 :(得分:0)
我遇到了同样的问题,发现我的移动信用余额已超出我的余额。
答案 6 :(得分:0)
我发现一旦数据超过160个字符,我就会失败。
答案 7 :(得分:0)
我遇到了同样的问题,我通过从sendTextMessage
删除SIM卡并将其制成null
来解决了该问题