Как «правильно» отправить смс при получении звонка?

1

Я пытаюсь, чтобы служба Android прослушивала входящий телефонный звонок, и когда это происходит, возьмите входящий номер и отправьте ему текст.

В моем служении я сделал PhoneStateListener:

TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener listener = new PhoneStateListener()
{
    @Override
    public void onCallStateChanged(int state, String incomingNumber)
    {
        switch(state)
        {
            case TelephonyManager.CALL_STATE_IDLE:
                Log.d(TAG, "Phone: Idle");
            break;
            case TelephonyManager.CALL_STATE_RINGING:
                Log.d(TAG, "Phone: Ringing.");
                Log.i(TAG, "Incoming call from: " + incomingNumber);
                sendSms();
            break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d(TAG, "Phone: Off Hook");
            break;
        }
    }
};
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

Моя функция sendSms() выглядит следующим образом:

private void sendSms()
{
    SmsManager manager = SmsManager.getDefault();

    wakeLock.acquire();
    Log.d(TAG, "Wake Lock Acquired!");

    if (getMessageContent(getInformStatus()).length() > 160)
    {
        ArrayList<String> messagelist = manager.divideMessage(getMessageContent(getInformStatus()));

        manager.sendMultipartTextMessage(getReturnAddress(), null, messagelist, null, null);
        Log.i(TAG, "Multipart Text Message Sent!");
    }
    else
    {
        manager.sendTextMessage(getReturnAddress(), null, getMessageContent(getInformStatus()), sentPI, null);
        Log.i(TAG, "Text Message Sent!");
    }

    wakeLock.release();
    Log.d(TAG, "Wake Lock Released!");
}

У меня даже есть приемник SMS_SENT Broadcast, чтобы проверить, правильно ли отправлено текстовое сообщение, которое вызовет функцию sendSms(), если она не отправлена по какой-либо причине:

resend = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        switch (getResultCode())
        {
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Log.e(TAG, "Text did NOT send (GENERIC_FAILURE)");
                Log.i(TAG, "Attempting to resend");
                sendSms();
            break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Log.e(TAG, "Text did NOT send (NO_SERVICE)");
                Log.i(TAG, "Attempting to resend");
                sendSms();
            break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Log.e(TAG, "Text did NOT send (RADIO_OFF)");
                Log.i(TAG, "Attempting to resend");
                sendSms();
            break;
        }
    }
};
registerReceiver(resend, new IntentFilter("android.provider.Telephony.SMS_SENT"));

Это хорошо работает на моем телефоне, однако на телефонах других людей ему иногда нравится переключаться между RINGING и IDLE в PhoneStateListener несколько раз, прежде чем "отправлять". Телефон фактически говорит, что приложение пытается отправить несколько текстовых сообщений и спрашивает пользователя, если все в порядке. Когда они нажимают "да", он просто спрашивает.

Чтобы сделать его лучше, он никогда не отправляет текстовое сообщение.

На другом телефоне это не делается вообще. Другой телефон будет проходить через движения, а логарифм идентичен моему.. На самом деле он говорит, что он отправляет, но получатель никогда не получает SMS.

Предположим, что это была служба автоответчика, и я хотел попробовать и заставить ее работать, по крайней мере, с Froyo, Gingerbread и Ice Cream Sandwich.

Кстати, он работает на 100%:
Galaxy Nexus (toro) (Android 4.0.3)
Droid 1 (sholes) (Android 2.3.7)
HTC Thunderbolt (mecha) (Android 2.3.7)

Однако, если это мой друг:
Nexus S 4G (crespo4g) (Android 4.0.3)
или мой друг
Galaxy Nexus (toro) (Android 4.0.3)

Это не работает.

Я действительно не понимаю, что это не работает с моим другом с тем же телефоном, что и я..

Я чувствую, что эта реализация кода - это хиты или промахи, и было интересно, есть ли у кого-нибудь понимание, чтобы помочь.

Ценить это!

  • 0
    Извините, что поднял старый вопрос, но этот вопрос интригует! Вы когда-нибудь выясняли, почему смс не принесли? Может быть потому, что вы не можете отправить смс во время звонка?
  • 0
    Кроме того, все телефоны использовали GSM? Кроме того, как вы узнали, что сообщение было отправлено? Как я вижу, вы не проверяете ACTIVITY.RESULT_OK в вашем приемнике вещания ......
Теги:

1 ответ

1

Кажется, я понял это. То, что я закончил, - это положить обработчика, который вызвал Runnable через 30 секунд после того, как был первоначально получен телефонный звонок. Это дало телефонное время для завершения телефонного звонка (при условии, что он был у вас в кармане), а затем чисто отправьте текстовое сообщение.,

Надеюсь, это единственные проблемы, с которыми я столкнулся, но, похоже, сейчас работает на моих друзей Galaxy Nexus (toro).

Надеюсь, это поможет кому-то еще задаться вопросом об этом.

Ура!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню