如何在收到电话时“正确”发送短信?

时间:2012-01-25 15:49:08

标签: java android

我正在尝试安排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 广播接收器,用于检查发送的文本消息是否会调用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"));

这适用于我的手机,但在其他人的手机上,它有时会在“发送”前几次在PhoneStateListener中来回切换 RINGING IDLE “..手机实际上是说应用程序试图发送多条短信并询问用户是否可以。当他们点击是时,它再次询问。

为了让它变得更好,永远不会实际发送短信..

在另一部手机上,它根本不会这样做..另一部手机将通过动作, logcat 与我的相同..它实际上是说它发送,但接收者永远不会获取短信..

假设是各种各样的自动回复服务,我想尝试至少使用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)

它确实工作..

我真正不明白的是,它与我的朋友无法使用与我完全相同的手机..

我觉得这个代码实现很受欢迎,并且想知道是否有人有一些洞察力来帮忙。

欣赏它!

1 个答案:

答案 0 :(得分:1)

我想我明白了。最后我做的是在最初收到电话后30秒内发出一个 Handler ,称为 Runnable ..这让手机有时间完成电话通话(假设它在你的口袋里)然后干净地发送短信..

我希望这是我遇到的唯一问题,但它现在似乎对我的朋友Galaxy Nexus(toro)起作用了..

希望这有助于其他人对此感到疑惑..

干杯!