私は Android で着信コール用のブロードキャスト レシーバを開発しています。着信コールを受信すると、ネイティブの着信コール画面にポップアップを表示したいと考えています。
そのコードを完成させました。しかし今の問題は、Android 4.1 (Jelly Bean) API レベル 17では、電話が鳴ったときにPHONE_STATE
が として来てOFF HOOK
、アクティビティを呼び出している場合は呼び出されますが、その下のコードは実行されません。コードをリストしています:
私の放送受信機
package com.example.popwindowonincomingcallscreen;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
public class IncomingBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("IncomingBroadcastReceiver: onReceive: ", "flag1");
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
Log.d("IncomingBroadcastReceiver: onReceive: ", state);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
|| state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Log.d("Ringing", "Phone is ringing");
Intent i = new Intent(context, IncomingCallActivity.class);
i.putExtras(intent);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Wait.oneSec();
context.startActivity(i);
}
}
}
私が呼んでいる活動:
import android.app.Activity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class IncomingCallActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
try {
Log.d("IncomingCallActivity: onCreate: ", "flag2");
*/ After this line, the code is not executed in Android 4.1 (Jelly Bean) only/*
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
Log.d("IncomingCallActivity: onCreate: ", "flagy");
setContentView(R.layout.main);
Log.d("IncomingCallActivity: onCreate: ", "flagz");
String number = getIntent().getStringExtra(
TelephonyManager.EXTRA_INCOMING_NUMBER);
TextView text = (TextView) findViewById(R.id.text);
text.setText("Incoming call from " + number);
}
catch (Exception e) {
Log.d("Exception", e.toString());
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
後
try {
Log.d("IncomingCallActivity: onCreate: ", "flag2");
}
コードは Android 4.1 (Jelly Bean) では実行されていませんが、他のバージョンでは動作しています。
私ができるほとんどすべての方法を試しました。このコードは、ネイティブの通話画面に半透明のアクティビティを表示しており、電話を取るなどのバックグラウンド コントロールをブロックしていません。しかし、私はそれが本当の発信者のようになりたいです。真の発信者が着信画面にウィンドウを表示している様子のスナップショットを添付しました。
Android アプリでこの機能を実現するにはどうすればよいですか?
これは真の呼び出し元がどのように機能するかです:
私の現在の出力:
更新 1
報奨金の後も、探しているものを正確に取得できませんが、すべてに戻ります。私はそれに取り組んでいます。とにかく、このコードはほとんどの Android フォンで機能します。誰かがそれを使用して解決策を見つけようとしている場合は、誰もが利益を得ることができるようにここに書いてください.
更新 2
トーストは Android のネイティブ コンポーネントであるため、ブロードキャスト レシーバーの onReceive メソッドに Toast を実装しようとしましたが、Android 4.1 (Jelly Bean) でも表示されません。
私のアイデアは、ブロードキャスト レシーバーの onReceive メソッドに Toast を実装し、その後、必要に応じてそのデザインを変更し、表示期間を調整することでした。しかし、もう 1 つの問題は、ブロードキャスト レシーバーでfindViewByIdが機能しないことです。そのため、トーストをカスタマイズするには、LinearLayout をプログラムで作成する必要があると思います。