Sending SMS programmatically to multiple people getting Generic Error

后端 未结 2 769
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-14 12:50

I am currently trying to develop an SMS application and allow a user to send SMS to multiple people.

As the SMS is long i have to use the sendMultipartTextMessage wh

相关标签:
2条回答
  • 2020-12-14 13:28

    IHMO you are not using the right approach. I'm using a different one and it is working. I try to explain:

    You should keep a counter for all pending intents because if the sms you are sending has two parts you will receive two RESULT_OK (or RESULT_ERROR_*) and only when you receive the results for all parts you should proceed sending the next sms. I don't like the idea of blocking the thread... maybe this is the reason you are getting strange errors.

    I refactored your code with my approach:

    private int mMessageSentParts;
    private int mMessageSentTotalParts;
    private int mMessageSentCount;
    
    private void startSendMessages(){
    
        registerBroadCastReceivers();
    
        mMessageSentCount = 0;
        sendSMS(array[mMessageSentCount].toString(), message);
    }
    
    private void sendNextMessage(){
        if(thereAreSmsToSend()){
            sendSMS(array[mMessageSentCount].toString(), message);
        }else{
            Toast.makeText(getBaseContext(), "All SMS have been sent",
                            Toast.LENGTH_SHORT).show();
        }
    }
    
    private boolean thereAreSmsToSend(){
        return mMessageSentCount < array.length;
    }
    
    private void sendSMS(final String phoneNumber, String message) {
        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++;
                        sendNextMessage();
                    }
    
                    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));
    
    }
    
    0 讨论(0)
  • 2020-12-14 13:45

    I have come same error "Generic failure" occured using this code. But i used array[mMessageSentCount].toString().trim(). Then its solved my problem & its working fine. Thanks

    0 讨论(0)
提交回复
热议问题