我正在尝试安排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)
它确实不工作..
我真正不明白的是,它与我的朋友无法使用与我完全相同的手机..
我觉得这个代码实现很受欢迎,并且想知道是否有人有一些洞察力来帮忙。
欣赏它!
答案 0 :(得分:1)
我想我明白了。最后我做的是在最初收到电话后30秒内发出一个 Handler ,称为 Runnable ..这让手机有时间完成电话通话(假设它在你的口袋里)然后干净地发送短信..
我希望这是我遇到的唯一问题,但它现在似乎对我的朋友Galaxy Nexus(toro)起作用了..
希望这有助于其他人对此感到疑惑..
干杯!