2017-03-31 34 views
0

我已經作出了服務類和類中我已經作出了BroadcastReciever主要內容如下:BroadcastReciever檢測兩個電話時,僅由一個呼叫

final BroadcastReceiver receiver = new BroadcastReceiver() { 
      private ITelephony telephonyService; 
      public void onReceive(Context context, Intent intent) { 
       TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
       try { 
        //Call Rejection 
        Class c = Class.forName(tm.getClass().getName()); 
        Method m = c.getDeclaredMethod("getITelephony"); 
        m.setAccessible(true); 
        ITelephony telephonyService = (ITelephony) m.invoke(tm); 
        Bundle bundle = intent.getExtras(); 
        String phoneNumber = bundle.getString("incoming_number"); 
        telephonyService.silenceRinger(); 
        telephonyService.endCall(); 

        //Checking if number is in contact list 
        String name=findNameByNumber(phoneNumber); 
        if(name.equals("Not Found")) 
        { 
         //Name Not Found 
        } 
        else 
        { 
         //name Found 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

findNameByNumber檢查的數量存在於我的聯繫方式清單:

private String findNameByNumber(String incomingNumber) { 
     String res = "Not Found"; 
     try { 
      ContentResolver resolver = getApplicationContext().getContentResolver(); 
      Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber)); 
      Cursor c = resolver.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 

      if (c != null) { 
       if (c.moveToFirst()) { 
        res = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
       } 
       c.close(); 
      } 
     } catch (Exception ex) { 
      Toast.makeText(getApplicationContext(),ex.toString(), Toast.LENGTH_SHORT).show(); 
     } 
     return res; 
    } 

這是怎麼我的IntentFilter對象,在服務類使用接收器的樣子:

IntentFilter filter = new IntentFilter(); 
     filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED); 
     registerReceiver(receiver,filter); 

但是,當一個呼叫來臨時,它被檢測爲兩個呼叫而不是一個。我該如何解決這個問題?

+0

:只要手機狀態改變,就會調用ACTION_PHONE_STATE_CHANGED。可以有幾個狀態更改,CALL_STATE_RINGING,call_state_idle。也許它從呼叫回到閒置並觸發兩次。 –

+0

那麼我能做些什麼來阻止呢? –

+0

你應該實際上可以在意圖中使用數據。它應該包含有關該事件的信息。 – RobCo

回答

0

宣讀了意圖獲取通話狀態

有這裏涉及到兩個狀態的變化: 一次是從空閒到振鈴 另一種是從鈴聲到空閒

String phoneState = intent.getStringExtra(Phone.STATE_KEY); 
       mPhoneState = (Phone.State) Enum.valueOf(
         Phone.State.class, phoneState); 



public class PhoneState extends PhoneStateListener { 

@Override 
public void onCallStateChanged(int state, String incomingNumber) { 
    switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
      //Some Action 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      //Some Action 
      break; 
     //case TelephonyManager.ANOTHER_STATE: ... 
    } 
    } 
} 
從Android的文檔
+1

這是可行的。我所做的唯一改變是,我用if語句代替switch case,因爲我與其他狀態無關。非常感謝! –