2014-10-17 66 views
1

我有一個廣播接收機註冊了來電事件狀態,我想確保空閒來電是拒絕來電,因爲拒絕接聽來電。爲此,我訪問CallLog提供程序以獲取最新的設備調用,並將其類型與CallLog.Calls.MISSED_TYPE進行比較。問題是,我的接收機在CallLog提供程序更新之前使用設備接收到的最後一次呼叫來執行此操作......這就是爲什麼我在接收機上使用Thread.sleep,以使接收機等待CallLog提供程序要更新他查詢它之前,你可以看到如下:檢查來電是否錯過

private boolean isMissedCall(Context context){ 
    //previous state is a global var 
    if(previousState != null && previousState.equals(RINGING)){ 

     //THIS IS UGLY!! 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     String callType = android.provider.CallLog.Calls.TYPE; 
     String callNew = android.provider.CallLog.Calls.NEW; 
     String callDate = android.provider.CallLog.Calls.DATE; 
     String[] strFields = { callType, callNew, callDate}; 

     String strOrder = callDate + " DESC"; 

     Cursor mCallCursor = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, 
       strFields, 
       null, 
       null, 
       strOrder); 

     if (mCallCursor.moveToFirst()) { 
      if(mCallCursor.getInt(mCallCursor.getColumnIndex(callNew)) > 0) { 
       return mCallCursor.getInt(mCallCursor.getColumnIndex(callType)) == CallLog.Calls.MISSED_TYPE; 
      } 
     } 
    } 
    return false; 
} 

我不開心具有把線程睡眠的解決方案,但我沒有找到任何地方,到目前爲止,對於另一種解決方案問題。我覺得必須有一種方法可以做到這一點,因此,我要求您提供有關如何從CallLog獲取最新來電的最佳方法,以及bradcast接收器的onReceive方法。

P.S:我的目標分鐘Android SDK中是8

提前

回答

0

謝謝,我發現了一個blog post這可能會回答你的問題也是如此。

檢測未接呼叫檢查低於部分在所提到的post

case TelephonyManager.CALL_STATE_IDLE: 
     //Went to idle- this is the end of a call. What type depends on previous state(s) 
     if(lastState == TelephonyManager.CALL_STATE_RINGING){ 
      //Ring but no pickup- a miss 
      onMissedCall(context, savedNumber, callStartTime); 
     }