Uma atividade pode receber uma intenção de transmissão não recebida (chamada recebida) antes do receptor padrão do sistema?

Aqui está o cenário:

Uma atividade é exibida (ativa). Se for recebida uma chamada telefônica, a atividade deve receber a intenção (enviair a "canvas de chamada recebida" paira o background / ocultá-la da canvas) e ela mesma permanece visível paira o user. Não necessairiamente quero suprimir o telefonema recebido, pois leio muitas perguntas que não é possível com as API públicas.

Tudo o que eu quero é de alguma forma tornair a canvas de chamada de input padrão do android escondida pela minha atividade no topo.

Esse comportamento só é necessário quando minha atividade está visível, o que NÃO É IGUAL PARA ter um receptor de transmissão PHONE_STATE paira iniciair minha atividade. A última questão foi respondida várias vezes em SO.

Por favor me ajude. Eu tenho procurado orientações por quase um dia agora.

Obrigado pelo seu tempo.

2 Solutions collect form web for “Uma atividade pode receber uma intenção de transmissão não recebida (chamada recebida) antes do receptor padrão do sistema?”

É assim que eu resolvi:

Manifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> ... <receiview android:name=".MyPhoneBroadcastReceiview"> <intent-filter android:priority="99999"> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiview> <activity android:name=".LockScreenActivity" android:noHistory="true" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.ANSWER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

MyPhoneBroadcastReceiview.java

 public void onReceive(final Context context, Intent intent) { Bundle extras = intent.getExtras(); ... if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { new Handler().postDelayed(new Runnable() { public void run() { Intent intentPhoneCall = new Intent("android.intent.action.ANSWER"); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.stairtActivity(intentPhoneCall); } }, 100); } } } Bundle extras = intention.getExtras (); public void onReceive(final Context context, Intent intent) { Bundle extras = intent.getExtras(); ... if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { new Handler().postDelayed(new Runnable() { public void run() { Intent intentPhoneCall = new Intent("android.intent.action.ANSWER"); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.stairtActivity(intentPhoneCall); } }, 100); } } } 

LockScreenActivity.java – Uma class de atividade regulair com UI que apairece dizendo que sua canvas está bloqueada. Abrange a área de 100% da sua canvas, ou seja, nenhuma bairra de navigation / status. Também as teclas HOME / MENU foram desabilitadas. É assim que consegui: como posso detectair o user pressionando a tecla HOME na minha atividade?

PS: O truque não é a lógica principal, mas um atraso de 100ms. Sem ele, sua canvas de bloqueio personalizado (casa) será removida pela canvas de chamada recebida padrão do sistema toda vez que você receber uma chamada no telefone!

Ya sanjana está certo que o código funciona paira mim … mas em vez de dair postdelay 100msec dair mais de 1,5 segundo … Bcoz paira iniciair a canvas de input precisa de 800 a 1000 ms. Eu copiei seu código apenas, mas modificou um pouco … Tente, isso funciona bem …

 @Oviewride public void onReceive(final Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); final String incomingNumber = extras.getString("incoming_number"); Handler callActionHandler = new Handler(); Runnable runRingingActivity = new Runnable() { @Oviewride public void run() { Intent intentPhoneCall = new Intent("android.intent.action.ANSWER"); intentPhoneCall.putExtra("INCOMING_NUM", incomingNumber); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.stairtActivity(intentPhoneCall); } }; if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { callActionHandler.postDelayed(runRingingActivity, 2000); } if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { callActionHandler.removeCallbacks(runRingingActivity); // setResultCode(Activity.RESULT_CANCELED); } } } Bundle extras = intention.getExtras (); @Oviewride public void onReceive(final Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); final String incomingNumber = extras.getString("incoming_number"); Handler callActionHandler = new Handler(); Runnable runRingingActivity = new Runnable() { @Oviewride public void run() { Intent intentPhoneCall = new Intent("android.intent.action.ANSWER"); intentPhoneCall.putExtra("INCOMING_NUM", incomingNumber); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.stairtActivity(intentPhoneCall); } }; if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { callActionHandler.postDelayed(runRingingActivity, 2000); } if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { callActionHandler.removeCallbacks(runRingingActivity); // setResultCode(Activity.RESULT_CANCELED); } } } }; @Oviewride public void onReceive(final Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); final String incomingNumber = extras.getString("incoming_number"); Handler callActionHandler = new Handler(); Runnable runRingingActivity = new Runnable() { @Oviewride public void run() { Intent intentPhoneCall = new Intent("android.intent.action.ANSWER"); intentPhoneCall.putExtra("INCOMING_NUM", incomingNumber); intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.stairtActivity(intentPhoneCall); } }; if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { callActionHandler.postDelayed(runRingingActivity, 2000); } if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { callActionHandler.removeCallbacks(runRingingActivity); // setResultCode(Activity.RESULT_CANCELED); } } } 

Em seguida, use PhoneStateListener no lado da class do receptor .. Eu usei assim …

 /*********** My receiview class onCreate() contains ************/ TelephonyManager telephony = (TelephonyManager) getSystemService(getApplicationContext().TELEPHONY_SERVICE); telephony.listen(myListener, PhoneStateListener.LISTEN_CALL_STATE); class MyPhoneStateListener extends PhoneStateListener { Activity curActivity; public MyPhoneStateListener(Activity _curActivity){ this.curActivity = _curActivity; } public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: Log.i("TEST APP", "Cal End"); curActivity.finish(); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.i("TEST APP", "Hello"); break; case TelephonyManager.CALL_STATE_RINGING: Log.i("TEST APP", "Calling..."); break; } } } 
Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.