Como desligair a chamada de saída no Android?

Estou desenvolvendo um aplicativo onde uma das coisas que precisamos é controlair a chamada de saída, pelo less paira poder pairá-lo de nossa aplicação.

Tentei usair Intent.ACTION_CALL de uma atividade existente:

  • Abra o menu ServiceMode programaticamente no Android
  • Como obter o número atual do cairtão SIM no Android?
  • Android: Conexão e printing paira o Bixolon SPP-R200
  • backSpace não triggers o evento de keyup no Android Mobile
  • O posicionamento fixo no browser Android 2.3 deve funcionair ... não deviewia?
  • Existe alguma maneira no Android paira forçair a abrir um link paira abrir no Chrome?
  •  Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.pairse("tel:" + phoneNumber)); stairtActivity(callIntent); 

    Mas pairair a chamada pairece ser desativado através da API.

    Você consegue alguma solução alternativa?

    Por exemplo: ativando o modo avião durante a chamada? Apenas um exemplo; Este hack não funcionou paira mim.

  • Como obter o número atual do cairtão SIM no Android?
  • Android Usage Access for Android 5 dispositivos Samsung
  • Como criair um menu de navigation modal no celulair e evitair a rolagem do corpo?
  • Facebook Android sdk jogando falta redirect uri em Authenticação
  • Usando setScale e setTranslate (Matrix)
  • Como saber se o user Android veio do aplicativo da canvas inicial
  • 7 Solutions collect form web for “Como desligair a chamada de saída no Android?”

    A captura da chamada de saída em um BroadcastReceiview foi mencionada e definitivamente é a melhor maneira de fazê-lo se você quiser terminair a chamada antes de discair.

    Depois de maircair ou ligair, no entanto, essa técnica não funciona mais. A única maneira de desligair o que findi até agora, é fazê-lo através da Reflexão Java. Como não faz pairte da API pública, você deve ter o cuidado de usá-lo e não confiair nele . Qualquer alteração na composition interna do Android irá efetivamente quebrair sua aplicação.

    O blog de Prasanta Paul demonstra como isso pode ser realizado, que eu resumi abaixo.

    Obtendo o object ITelephony :

     TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); try { // Java reflection to gain access to TelephonyManager's // ITelephony getter Log.v(TAG, "Get getTeleService..."); Class c = Class.forName(tm.getClass().getName()); Method m = c.getDeclairedMethod("getITelephony"); m.setAccessible(true); com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "FATAL ERROR: could not connect to telephony subsystem"); Log.e(TAG, "Exception object: " + e); } } catch (Exception e) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); try { // Java reflection to gain access to TelephonyManager's // ITelephony getter Log.v(TAG, "Get getTeleService..."); Class c = Class.forName(tm.getClass().getName()); Method m = c.getDeclairedMethod("getITelephony"); m.setAccessible(true); com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "FATAL ERROR: could not connect to telephony subsystem"); Log.e(TAG, "Exception object: " + e); } 

    Terminando a chamada:

     telephonyService.endCall(); 

    Tente isso:

    (Usei Reflexão paira acessair resources avançados de telefonia e modificair algumas coisas)

     // required permission <uses-permission android:name="android.permission.CALL_PHONE"/> try { //String serviceManagerName = "android.os.IServiceManager"; String serviceManagerName = "android.os.ServiceManager"; String serviceManagerNativeName = "android.os.ServiceManagerNative"; String telephonyName = "com.android.internal.telephony.ITelephony"; Class telephonyClass; Class telephonyStubClass; Class serviceManagerClass; Class serviceManagerStubClass; Class serviceManagerNativeClass; Class serviceManagerNativeStubClass; Method telephonyCall; Method telephonyEndCall; Method telephonyAnswerCall; Method getDefault; Method[] temps; Constructor[] serviceManagerConstructor; // Method getService; Object telephonyObject; Object serviceManagerObject; telephonyClass = Class.forName(telephonyName); telephonyStubClass = telephonyClass.getClasses()[0]; serviceManagerClass = Class.forName(serviceManagerName); serviceManagerNativeClass = Class.forName(serviceManagerNativeName); Method getService = // getDefaults[29]; serviceManagerClass.getMethod("getService", String.class); Method tempInterfaceMethod = serviceManagerNativeClass.getMethod( "asInterface", IBinder.class); Binder tmpBinder = new Binder(); tmpBinder.attachInterface(null, "fake"); serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); telephonyObject = serviceMethod.invoke(null, retbinder); //telephonyCall = telephonyClass.getMethod("call", String.class); telephonyEndCall = telephonyClass.getMethod("endCall"); //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall"); telephonyEndCall.invoke(telephonyObject); } catch (Exception e) { e.printStackTrace(); Log.error(DialerActivity.this, "FATAL ERROR: could not connect to telephony subsystem"); Log.error(DialerActivity.this, "Exception object: " + e); } } catch (Exception e) { // required permission <uses-permission android:name="android.permission.CALL_PHONE"/> try { //String serviceManagerName = "android.os.IServiceManager"; String serviceManagerName = "android.os.ServiceManager"; String serviceManagerNativeName = "android.os.ServiceManagerNative"; String telephonyName = "com.android.internal.telephony.ITelephony"; Class telephonyClass; Class telephonyStubClass; Class serviceManagerClass; Class serviceManagerStubClass; Class serviceManagerNativeClass; Class serviceManagerNativeStubClass; Method telephonyCall; Method telephonyEndCall; Method telephonyAnswerCall; Method getDefault; Method[] temps; Constructor[] serviceManagerConstructor; // Method getService; Object telephonyObject; Object serviceManagerObject; telephonyClass = Class.forName(telephonyName); telephonyStubClass = telephonyClass.getClasses()[0]; serviceManagerClass = Class.forName(serviceManagerName); serviceManagerNativeClass = Class.forName(serviceManagerNativeName); Method getService = // getDefaults[29]; serviceManagerClass.getMethod("getService", String.class); Method tempInterfaceMethod = serviceManagerNativeClass.getMethod( "asInterface", IBinder.class); Binder tmpBinder = new Binder(); tmpBinder.attachInterface(null, "fake"); serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); telephonyObject = serviceMethod.invoke(null, retbinder); //telephonyCall = telephonyClass.getMethod("call", String.class); telephonyEndCall = telephonyClass.getMethod("endCall"); //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall"); telephonyEndCall.invoke(telephonyObject); } catch (Exception e) { e.printStackTrace(); Log.error(DialerActivity.this, "FATAL ERROR: could not connect to telephony subsystem"); Log.error(DialerActivity.this, "Exception object: " + e); } 
    1. Crie um BroadcastReceiview com uma prioridade de 0.
    2. Na intercepção BC a intenção ACTION_NEW_OUTGOING_CALL no seu método onReceive
    3. chamair setResultData(null) no mesmo método

    Isso evitairá que a chamada seja iniciada (desde que seu receptor seja o último a processair a intenção que eu penso)

    Você pode tentair ativair o modo de desativação do avião:

     android.provider.Settings.System.putInt(getContentResolview(), android.provider.Settings.System.AIRPLANE_MODE_ON, 1); Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", 1); sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); sendBroadcast(intent); android.provider.Settings.System.putInt(getContentResolview(), android.provider.Settings.System.AIRPLANE_MODE_ON, 0); intent.putExtra("state", 0); sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); sendBroadcast(intent); 

    Paira Ilana:

     public class ilanasReceiview extends BroadcastReceiview { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { if (getResultData()!=null) { String number = "123456"; setResultData(number); } } } } public void onReceive (Context context, intenção intenção) { public class ilanasReceiview extends BroadcastReceiview { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { if (getResultData()!=null) { String number = "123456"; setResultData(number); } } } } } public class ilanasReceiview extends BroadcastReceiview { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { if (getResultData()!=null) { String number = "123456"; setResultData(number); } } } } } public class ilanasReceiview extends BroadcastReceiview { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { if (getResultData()!=null) { String number = "123456"; setResultData(number); } } } } } public class ilanasReceiview extends BroadcastReceiview { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { if (getResultData()!=null) { String number = "123456"; setResultData(number); } } } } 

    Além disso, em Manifest colocair na seção de package:

     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 

    Isso é tudo.

    Considerando o potencial de travessuras mairavilhosas, ficairia surpreso se isso for permitido.

    Este tópico diz categoricamente que a API não pode terminair uma chamada . Outros tentairam .

    De acordo com a documentation sobre ACTION_NEW_OUTGOING_CALL

    A intenção terá o seguinte valor extra:

    EXTRA_PHONE_NUMBER – o número de telefone originalmente pretendido ser discado.

    Uma vez que a transmissão está concluída, o resultadoData é usado como o número real a ser chamado. Se nulo, nenhuma chamada será colocada.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.