尽管尝试了所有方法,SMSManager仍返回RESULT_ERROR_GENERIC_FAILURE

2024-01-12

我正在尝试在我的应用程序中创建一项功能,可以在后台向多个联系人发送短信。我在用SMS Manager API做同样的事情。然而,每次RESULT_ERROR_GENERIC_FAILURE返回。我读了很多关于堆栈溢出的类似帖子,并尝试了所有解决方案,但似乎没有一个对我有用。具体来说,我尝试过以下操作:

  1. 将电话号码格式更改为“+91xxxxxxxxxx”、“9xxxxxxxxx”、“91xxxxxxxxx”
  2. 检查SIM卡余额
  3. 短信服务中心号码也有效
  4. SMS 消息长度在 160 个字符以内
  5. 延迟发送多条短信

以下是我发送短信的方式:

for (int index = 0; index < contactsList.size(); index++) {
            final String phonenumber = contactsList.get(index).getPhone().substring(1);

            if (index == 0) {
                sendSMS(phonenumber.trim(), sms, contactsList);
            } else {
                new Handler().postDelayed(new Runnable() {
                    public void run() {

                        sendSMS(phonenumber.trim(), sms, contactsList);
                    }
                }, 1000 * 20);
            }
        }

Here is sendSMS method:

private void sendSMS(String phoneNumber, final String message, final List<MyContactsActivity.ContactsRow> list) {
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, new Intent(
                SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0,
                new Intent(DELIVERED), 0);

        // ---when the SMS has been sent---
        context.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        ContentValues values = new ContentValues();
                        for (int i = 0; i < list.size() - 1; i++) {
                            values.put("address", list.get(i).getPhone());
                            values.put("body", message);
                        }
                        context.getContentResolver().insert(
                                Uri.parse("content://sms/sent"), values);
                        Toast.makeText(context, "SMS sent", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "1");
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "2");
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "3");
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "4");
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "5");
                        break;
                }
            }
        }, new IntentFilter(SENT));

        // ---when the SMS has been delivered---
        context.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "6");
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show();
                        Log.e("Panic", "7");
                        break;
                }
            }
        }, new IntentFilter(DELIVERED));

        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    }

这是我的相关清单权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS" />

注意:我正在运行 Android 6 的真实设备上测试我的应用程序。我已检查运行时权限以及它们是否已启用。

谁能告诉我我做错了什么?


我已经找到了这个问题的解决方案。对于双 SIM 卡手机,有一个选项指定从哪个 SIM 卡发送短信。如果选项已设置为“每次询问”,则会发生一般故障。解决方案是将此选项设置为任一 SIM 卡。但是,我还没有找到编程方法来做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管尝试了所有方法,SMSManager仍返回RESULT_ERROR_GENERIC_FAILURE 的相关文章

随机推荐