Я пытаюсь, чтобы служба 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)
Это не работает.
Я действительно не понимаю, что это не работает с моим другом с тем же телефоном, что и я..
Я чувствую, что эта реализация кода - это хиты или промахи, и было интересно, есть ли у кого-нибудь понимание, чтобы помочь.
Ценить это!
Кажется, я понял это. То, что я закончил, - это положить обработчика, который вызвал Runnable через 30 секунд после того, как был первоначально получен телефонный звонок. Это дало телефонное время для завершения телефонного звонка (при условии, что он был у вас в кармане), а затем чисто отправьте текстовое сообщение.,
Надеюсь, это единственные проблемы, с которыми я столкнулся, но, похоже, сейчас работает на моих друзей Galaxy Nexus (toro).
Надеюсь, это поможет кому-то еще задаться вопросом об этом.
Ура!