2012-03-28 2 views
10

Me gustaría implementar una aplicación para bloquear un número móvil para recibir o enviar llamadas y mensajes. En mi aplicación, estoy ingresando el número de móvil en el EditText cuadro, luego hago clic en un botón para bloquear el número de teléfono móvil que ingresó el usuario.¿Cómo bloquear una llamada de número de móvil y la recepción de un mensaje en el desarrollo de aplicaciones de Android?

he implementado una clase de actividad como sigue:

public class BlockNumberActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ((Button)findViewById(R.id.block)).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String mobileNumer = ((EditText)findViewById(R.id.mobileNum)).getText().toString(); 
       //How to block entered mobileNumber 
      } 
     }); 

     ((Button)findViewById(R.id.unblock)).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String mobileNumer = ((EditText)findViewById(R.id.mobileNum)).getText().toString(); 
       //How to unblock entered mobileNumber 
      } 
     }); 
    } 
} 

creo que podemos utilizar BroadcastReceiver. Pero no tengo más conocimiento sobre eso. Por favor, dame una idea de cómo implementar el bloqueo o desbloqueo del número de móvil. Por favor, cualquier organismo que me ayude .....

+0

Intente ver esto [BlockIncoming Messages] (http://stackoverflow.com/q/9378431/940096) y [Bloquear llamadas entrantes] (http://stackoverflow.com/q/2334465/940096) – Praveenkumar

Respuesta

23

crear PhoneCallReceiver .JAVA

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 
public class PhoneCallReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    PhoneCallStateListener customPhoneListener = new PhoneCallStateListener(context); 
    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 



}} 

ahora crear PhoneCallStateListener .java

import java.lang.reflect.Method; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.widget.Toast; 

import com.android.internal.telephony.ITelephony; 

public class PhoneCallStateListener extends PhoneStateListener {  

private Context context; 
public PhoneCallStateListener(Context context){ 
    this.context = context; 
} 


@Override 
public void onCallStateChanged(int state, String incomingNumber) { 
    SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context); 

    switch (state) { 

     case TelephonyManager.CALL_STATE_RINGING:  

       String block_number = prefs.getString("block_number", null); 
      AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
      //Turn ON the mute 
      audioManager.setStreamMute(AudioManager.STREAM_RING, true);     
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      try { 
       Toast.makeText(context, "in"+block_number, Toast.LENGTH_LONG).show(); 
       Class clazz = Class.forName(telephonyManager.getClass().getName()); 
       Method method = clazz.getDeclaredMethod("getITelephony"); 
       method.setAccessible(true); 
       ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);  
       //Checking incoming call number 
       System.out.println("Call "+block_number); 

       if (incomingNumber.equalsIgnoreCase("+91"+block_number)) { 
        //telephonyService.silenceRinger();//Security exception problem 
        telephonyService = (ITelephony) method.invoke(telephonyManager); 
        telephonyService.silenceRinger(); 
        System.out.println(" in "+block_number); 
        telephonyService.endCall(); 
       } 
      } catch (Exception e) { 
       Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show(); 
      } 
      //Turn OFF the mute  
      audioManager.setStreamMute(AudioManager.STREAM_RING, false); 
      break; 
     case PhoneStateListener.LISTEN_CALL_STATE: 

    } 
    super.onCallStateChanged(state, incomingNumber); 
}} 

Ahora en src crear esta paquetecom.android.internal.telephonyahora en este paquete Haga clic derecho -> Nuevo -> Archivo ahora dan nombre ITelephony.aidl y pega este código

package com.android.internal.telephony; 

interface ITelephony {  

    boolean endCall();  

    void answerRingingCall();  

    void silenceRinger(); 
} 

NOTA: Código es probado en Android 2.2 (Froyo), 2.3 (GingerBread)

+0

¿cómo puedo ejecutar la clase PhoneCallStateListener en mi aplicación? Me refiero a cómo se ejecutará? –

+0

actualizó el código fuente –

+0

y aquí puede especificar este String block_number = "Número de 10 dígitos"; –

3
+0

lo haría como bloquear un número de móvil que ha ingresado el usuario solo –

-1

este código está trabajando ...

primera descarga esta clase ITelephony

if ((state != null) 
       && (state.equals(TelephonyManager.EXTRA_STATE_RINGING))) { 
      CallLogReceiver.phoneNo = intent.getExtras().getString(
        "incoming_number"); 

      if (CallLogReceiver.blockNo.equals(CallLogReceiver.phoneNo)) { 

       Intent blockCallIntent = new Intent(); 
       blockCallIntent.setClassName("com.example.calllogdemo", 
         "com.example.calllogdemo.BlockCallActivity"); 
       blockCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       blockCallIntent 
         .putExtra("blockNo", CallLogReceiver.phoneNo); 
       context.startActivity(blockCallIntent); 
       try { 
        TelephonyManager telephonyManager = (TelephonyManager) context 
          .getSystemService(Context.TELEPHONY_SERVICE); 

        Class<?> classTelephony = Class 
          .forName(telephonyManager.getClass().getName()); 
        Method methodGetITelephony = classTelephony 
          .getDeclaredMethod("getITelephony"); 

        methodGetITelephony.setAccessible(true); 

        ITelephony telephonyService = (ITelephony)   methodGetITelephony 
          .invoke(telephonyManager); 

        telephonyService.endCall(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

y utilizar este permiso en el archivo de manifiesto

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

Este código funciona para mí

try { 

      String serviceManagerName = "android.os.ServiceManager"; 
      String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
      String telephonyName = "com.android.internal.telephony.ITelephony"; 
      Class<?> telephonyClass; 
      Class<?> telephonyStubClass; 
      Class<?> serviceManagerClass; 
      Class<?> serviceManagerNativeClass; 
      Method telephonyEndCall; 
      Object telephonyObject; 
      Object serviceManagerObject; 
      telephonyClass = Class.forName(telephonyName); 
      telephonyStubClass = telephonyClass.getClasses()[0]; 
      serviceManagerClass = Class.forName(serviceManagerName); 
      serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
      Method getService = 
        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); 
      telephonyEndCall = telephonyClass.getMethod("endCall"); 
      telephonyEndCall.invoke(telephonyObject); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Toast.makeText(context, "Unable to Block Call", Toast.LENGTH_SHORT).show(); 


    } 
Cuestiones relacionadas