2011. 1. 5. 14:59

안드로이드 수신/발신 정보 가져오기 android call log





폰 사용량을 알기 위해 안드로이드 수신/발신 정보를 가져오려고 한다.

 

안드로이드 수신/발신 정보 가져오기 CallLog 이용

  1. private void getHistory() {
  2. String[] projection = { CallLog.Calls.CONTENT_TYPE, CallLog.Calls.NUMBER, CallLog.Calls.DURATION, CallLog.Calls.DATE };
               
    Cursor cur = managedQuery(CallLog.Calls.CONTENT_URI, null, CallLog.Calls.TYPE + "= ?",
                    new String[]{ String.valueOf(CallLog.Calls.OUTGOING_TYPE) },                CallLog.Calls.DEFAULT_SORT_ORDER);
           
    Log.d("db count=", String.valueOf(cur.getCount()));
    Log.d("db count=", CallLog.Calls.CONTENT_ITEM_TYPE);
    Log.d("db count=", CallLog.Calls.CONTENT_TYPE);

    if(cur.moveToFirst() && cur.getCount() > 0) {
       while(cur.isAfterLast() == false) {
          StringBuffer sb = new StringBuffer();

          sb.append("call type=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.TYPE)));
          sb.append(", cashed name=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.CACHED_NAME)));
          sb.append(", content number=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.NUMBER)));
          sb.append(", duration=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.DURATION)));
          sb.append(", new=").append(cur.getString(cur.getColumnIndex(CallLog.Calls.NEW)));
          sb.append(", date=").append(timeToString(cur.getLong(cur.getColumnIndex(CallLog.Calls.DATE)))).append("]");
          cur.moveToNext();
          Log.d("call history[", sb.toString());
         
          }
       }
  3. }
  4. androidManifest.xml에 추가
  5. <uses-permission android:name="android.permission.READ_CONTACTS" />

 

아주 편리하게도 api가 있다. CallLog를 이용해서 DB 에 저장된 내용을 가져올 수 있다.

주석 없이도 볼 수 있을 거란 생각에 주석은 생략한다.

 

CallLog의 경우 사용자가 전화통화내역 삭제를 누를 경우 볼 수 없다.

그리하야 별도로 call log 를 쌓으려고 한다.

방법은 직접 action을 감지하고, 통화 내역을 계산하여 별도의 DB에 쌓는 것이다.

안드로이드 수신/발신 정보 모니터링 하기

  1.     private String LOG_TAG = "CheckCall";
        private static int pState = TelephonyManager.CALL_STATE_IDLE;
  2.  
  3. public void onReceive(Context context, final Intent intent) {
            TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

            telManager.listen(new PhoneStateListener(){
                public void onCallStateChanged(int state, String incomingNumber){
                        if(state != pState){
                            if(state == TelephonyManager.CALL_STATE_IDLE){
                               Toast.makeText(mContext, "IDLE" + String.valueOf(System.currentTimeMillis()), Toast.LENGTH_SHORT).show();
                            }
                            else if(state == TelephonyManager.CALL_STATE_RINGING){
                                Toast.makeText(mContext, "RINGING" + String.valueOf(System.currentTimeMillis() +incomingNumber), Toast.LENGTH_SHORT).show();
                            }
                            else if(state == TelephonyManager.CALL_STATE_OFFHOOK){
                               Toast.makeText(mContext, "OFFHOOK" + String.valueOf(System.currentTimeMillis()), Toast.LENGTH_SHORT).show();
                            }
                            pState = state;
                        }
                }
            }, PhoneStateListener.LISTEN_CALL_STATE);
           
            if(Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())){
                Log.i(LOG_TAG, "out=" + intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
            }
        }
  4.  
  5. AndroidManifest.xml

  6. <receiver android:name=class name>
            <intent-filter>
                  <action android:name="android.intent.action.PHONE_STATE" />
                  <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
    </receiver>

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

  8.  
  9. 참고자료

 

이정도 코드 역시 주석이 없이도 쉬이 할 수 있을 것 같아서 그냥 붙여 넣었다. 매니페스트에 권한과 인텐트 필터 넣는 것을 몰라 한참을 리서치 했다.

 

  1. state

  2. 발신시
  3. Intent.ACTION_NEW_OUTGOING_CALL -> offhook -> idle

  4. 수신시
  5. Ring -> offhook -> idle

 

 원문 :http://whdnfl21.springnote.com/pages/6833219