特定の番号 (123456789 と呼びましょう) に発信呼び出しが行われたときに、数桁の URL に HTTP 投稿を送信し、OK を待ってから、呼び出しを許可するアプリを作成しています。
ただし、この HTTP POST に 4 秒以上かかる場合は、発信番号に DTMF として数字を追加します。
問題は、Android では、メイン スレッドをスリープ状態にすべきではない (またはスリープ状態にできない) ことです。そうしないと、電話が応答しなくなり、クラッシュします。 POSTを実行している間、4秒。
これは、コードがどのように見えるかのアイデアです。特定のコード行については説明しませんが、通話を行う前に電話が Post の結果を待つようにする方法を理解しようとしています。
public class OutgoingCallReceiver extends BroadcastReceiver {
public void onReceive(Context pContext, Intent intent) {
Context context = pContext;
String action = intent.getAction();
String digitsToSend = ",1234";
String outgoingNumber = getResultData();
if (action.equals(Intent.ACTION_NEW_OUTGOING_CALL)
&& isNetworkAvailable(pContext)
&& outgoingNumber.equals("123456789") {
try{
//We set a HTTPConnection with timeouts, so it fails if longer than 4 seconds
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 2000); // allow 2 seconds to create the server connection
HttpConnectionParams.setSoTimeout(httpParameters, 2000); // and another 2 seconds to retreive the data
HttpClient client = new DefaultHttpClient(httpParameters);
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() == 200){
//Success
setResultData(outgoingNumber);
}
} catch (Exception e){
//Took too long, sending digits as DTMFs
setResultData(outgoingNumber+digitsToSend);
}
}
}