2011-08-06 8 views
0

ブロックまたは許可リストに異なる電話番号を設定できるアプリを作成したいと思います。特定の電話番号のみをブロックしたり許可したりすることは可能ですか?もしそうなら、どうすればこのことをやりますか?事前に感謝、ジョナサン。着信および発信電話をブロックしていますか?

+0

contentObserverは、あなたが呼び出しの放送を受け取ると、電話を使用し –

+0

役立ちますISDLコールを終了する。 telephony isdlには、通話を終了するのに役立つ終了通話方法が含まれています。特定の番号の場合は、テレフォニーマネージャーの番号を確認する必要があります –

答えて

0

登録されたPhoneStateListenerを使用してサービスを作成する必要があるように思えます。このサービスを使用すると、電話の状態の変更に関するイベントを聴くことができます。だから誰かがあなたのリスナーでそのイベントをキャッチし、それに応じて反応することができます。あなた自身のPhoneStateListenerは、次のようになります。電話の状態は着信番号があなたの「ブロックされた番号に番号と等しい場合は、着信コールをブロックするように、あなたのロジックを置くことができCALL_STATE_RINGING等しい場合

public class CustomPhoneStateListener extends PhoneStateListener { 

public void onCallStateChanged(int state, String incomingNumber) { 

    switch (state) { 
    case TelephonyManager.CALL_STATE_IDLE:    
     doSomething(); 
     break; 
    case TelephonyManager.CALL_STATE_OFFHOOK: 
     doSomething(); 
     break; 
    case TelephonyManager.CALL_STATE_RINGING: 
     if(incomingNumber.equels(blockedNumber)) { 
      blockNumber(); 
     } 
     break; 
    } 
} 

}

をリスト"。すべての機能を有効にするには、そのリスナーをサービスに登録する必要があります(onCreateメソッドでonDestroyで登録を忘れないでください)。また、電話状態を読み取ることができるアンドロイドマニフェストに権限を追加します。

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

最初の放送レシーバを作成します。 1))

2レシーバをマニフェストに追加します。あなたは少なくとも一度にアプリを開始した後

public class CallReciever extends BroadcastReceiver 
{ 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
    ArrayList<String> rejectList=getListFromDb()//you need to implement this method 
    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) 
    { 
     String num = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
     if (rejectList.Contains(num)) 
     { 
      disconnectCall(); 


     } 
    } 
public void disconnectCall(){ 
    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 = // 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); 
     telephonyEndCall = telephonyClass.getMethod("endCall"); 
     telephonyEndCall.invoke(telephonyObject); 

     } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e("GABI", 
       "FATAL ERROR: could not connect to telephony subsystem"); 
     Log.e("GABI", "Exception object: " + e); 
    } 
    } 

} 

は今、こののみ動作します。 (あなたはstartActivityを呼び出します別のレシーバを使用して起動時にサービスを開始するためにあなたのアプリを呼び出すことができます)それのための permisionsと宣言されています

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name="com.my.CustomReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 
関連する問題