androidcalllog
① android 如何讀取通話記錄
安卓手機上的通話記錄可以按照以下步驟來進行獲取(包括刪除的通話記錄)。
1,首先對安卓手機進行一鍵Root,方法很簡單,在電腦上安裝「360一鍵Root」軟體,然後按提示,將安卓手機用數據線連接到電腦上對其進行Root即可。
② android 同一號碼通話記錄次數怎麼獲得
通過CallLog.CONTENT_URI來查詢通話記錄, 然後自己統計
祝你愉快,滿意請採納哦
③ 恢復通話記錄的代碼
(一) 前言
Android默認提供了聯系人備份到sd卡的功能(代碼在com.android.vcard包裡面),我們可以把聯系人導出成.vcf文件存在sd卡中;如果換手機了,我們又可以把聯系人從sd卡文件中導入進來。那麼,通話記錄我們也能不能做出類似的功能呢?答案是肯定的!
(二) 導出通話記錄
既然是備份通話記錄,那就肯定包括導出和導入的功能,這里我們先講導出通話記錄。
1. 根據通話記錄導出的規范,導出的文件一般以.vcl後綴結尾,中間的內容是
復制代碼 代碼如下:
BEGIN:VCALL
SLOT:0 //卡槽號 0:單卡手機 1: 雙卡手機卡槽1 2: 雙卡手機卡槽2
TYPE:1 //電話類型 1:接入電話,2: 呼出電話 3: 未接電話
Date: 2013/02/12 14:11:12 GMT //來電或者去點的時間 備份時以GMT時間記錄,恢復時顯示手機時區對應時間
NUMBER:+86134xxxxx //對方號碼
DURATION:5 //持續時間,秒數
END:VCALL
那麼這里就是一條通話記錄的存儲格式了,以BEGIN:VCALL 開始 END:VCALL結束。 //表示的是該欄位的含義,只是為了讓大家理解,不會導入到實際的文件中去。那麼我們來看實際怎麼導出的。
2. 查詢通話記錄列表
ok.. 既然是保存通話記錄,那麼首先要查詢通話記錄
Android裡面提供了一個CallLogProvider來滿足大家的這個需求,它在系統中配置的名字是「call_log」, 所以大家只要提供一個這樣的Uri就可以查詢了,比如:
復制代碼 代碼如下:
Uri uri = Uri.parse("context://call_log/calls");
Cursor c = mContext.getContentResolver().query(uri, xxx, xxx );
這樣就可以查詢出所有的通話記錄,得到游標。。
④ 如何導入android系統的通話記錄
涉及到對通話記錄的讀和寫、需要在sd卡上寫存放通話記錄數據的文件,所以需要加許可權:
[html] view plain
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
首先,通話記錄的獲取,只需要獲取部分欄位即可滿足即可:
將數據保存到一個自定義的Model對象中。
[html] view plain
Cursor cursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, "date > ?", new String[] { "" + timestamp }, CallLog.Calls.DEFAULT_SORT_ORDER);
while (cursor.moveToNext()) {
CalllogModel calllogModel = new CalllogModel();
// name
calllogModel.setName(cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)));
// start call datetime
calllogModel.setDatetime(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)));
// phonenumber
calllogModel.setNumber(cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)));
// ration
calllogModel.setDuration(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DURATION)));
// call type
calllogModel.setType(cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)));
// is read
calllogModel.setIs_read(cursor.getInt(cursor.getColumnIndex(CallLog.Calls.IS_READ)));
modifyVector(0, calllogModel, ADD_VECTOR); //調用保存到文件的方法
}
cursor.close();
cursor = null;
將通話記錄導入到系統的資料庫中:
[html] view plain
ContentResolver contentResolver = mContext.getContentResolver();
values.put(CallLog.Calls.CACHED_NAME, calllogModel.getName());
values.put(CallLog.Calls.NUMBER, calllogModel.getNumber());
values.put(CallLog.Calls.DATE, calllogModel.getDatetime());
values.put(CallLog.Calls.DURATION, calllogModel.getDuration());
values.put(CallLog.Calls.IS_READ, calllogModel.getIs_read());
values.put(CallLog.Calls.TYPE, calllogModel.getType());
contentResolver.insert(CallLog.Calls.CONTENT_URI, values);
還有兩點考慮:
1. 通話記錄的保存方式:
選擇通過文本文件來保存,一行算足一條通話記錄。
每個通話記錄以字元串的形式保存到文本文件
java中提供BufferReader和BufferWriter兩個類可以支持一行一行的讀和寫
在導入通話記錄的時候,讀到一行記錄,就處理一行:string->json->model->contentvalues->contentResolver.insert
2. 處理效率和OOM異常避免的情況
在處理導出通話記錄的時候,通話記錄的條數可能成千上萬條。
在這樣的情況下,需要注意:
a. 那麼多記錄數不能全部寫到內存中,暫據的內存太大,容易報OOM的錯誤
b. 將那些數據寫入到文件中的時候,不能每一次都打開IO流和關閉IO流,耗時耗資源
解決的方法是,維護一個集合Vector<model>,當從系統資料庫中讀取到一條記錄的時候,將其vector,add(model);當每處理完一個model之後,通過vector.remove(0)獲取新的Model對象進行處理。
讀取記錄的過程和處理記錄的過程,用兩個線程同步執行。
保證多線程下數據的安全考慮,對該集合變數的操作,用同步鎖對其進行限定
[html] view plain
/**
* 需要增加一個對象到集合的時候,type=1;需要獲取一個對象的時候,type=2
* @param index
* @param calllogModel
* @param type
* @return
*/
private static synchronized CalllogModel modifyVector(int index, CalllogModel calllogModel, int type) {
switch (type) {
case 1:
if (calllogModels.size()>1000) { //確保集合的體積不會過大
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
calllogModels.add(calllogModel);
break;
case 2:
if (!calllogModels.isEmpty()) {
return calllogModels.remove(0);
} else {
return null;
}
default:
break;
}
return null;
}
⑤ android 開發怎麼獲取去電的通話時長
StringBuilder smsBuilder1 = new StringBuilder();
String str = null; String strNumber,strName = ""; int type; long callTime; Date date; String time= ""; ContentResolver cr = getContentResolver(); final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE, CallLog.Calls.DATE,CallLog.Calls.DURATION}, null, null,CallLog.Calls.DEFAULT_SORT_ORDER); cursor.moveToPosition(0); do{ strNumber = cursor.getString(0); //呼叫號碼 strName = cursor.getString(1); //聯系人姓名 type = cursor.getInt(2); //來電:1,撥出:2,未接:3 public static final int INCOMING_TYPE = 1; public static final int OUTGOING_TYPE = 2; public static final int MISSED_TYPE = 3; if(type == 1){ str = "來電"; }else if(type == 2){ str = "撥出"; }else if(type == 3){ str = "未接"; } long ration = cursor.getLong(4); //通話時間 SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); date = new Date(Long.parseLong(cursor.getString(3))); time = sfd.format(date); smsBuilder1.append(strNumber+","); smsBuilder1.append(strName+","); smsBuilder1.append(str+","); smsBuilder1.append(ration+","); smsBuilder1.append(time+"\n"); }while(cursor.moveToNext()); textView2.setText(smsBuilder1.toString());
添加許可權:
<uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.READ_CALL_LOG"/> <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
⑥ android對通話記錄刪除過後怎麼更新數據
1.刪除通話記錄
2.
負責存放呼叫記錄的內容提供者源碼在ContactsProvider項目下:
源碼路徑:
com/android/providers/contacts/CallLogProvider.java
使用到的資料庫在:
/data/data/com.android.providers.contacts/databases/contacts2.db
表名:calls
呼叫記錄有三種類型:
來電:CallLog.Calls.INCOMING_TYPE(常量值:1)
已撥:CallLog.Calls.OUTGOING_TYPE(常量值:2)
未接:CallLog.Calls.MISSED_TYPE(常量值:3)
查看源碼中的聲明:
<provider android:name="CallLogProvider"
android:authorities="call_log"
android:syncable="false" android:multiprocess="false"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
</provider>
3.需要聲明的許可權
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
4.系統的通話記錄,是通過ContentProvider來對外共享的
5. Uri
CallLog.Calls.CONTENT_URI :等價於:Uri.parse("content://call_log/calls");
6.查詢出所有記錄
ContentResolver resolver = getContentResolver();
resolver.query(CallLog.Calls.CONTENT_URI, null, null, new String[]{"15101689022"}, null);
7.查詢某一個聯系人的所有記錄(按電話號碼)
resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{"15101689022"}, null);
8.查詢某一個聯系人的所有未接電話記錄(按電話號碼)
resolver.query(CallLog.Calls.CONTENT_URI, null, "number=? and type=3", new String[]{"15101689022"}, null);
8.刪除某聯系人最近的一次來電
[html]view plain
/*本代碼因為在Activity中,所以可以直接調用getContentResolver()。這個方法實際上是Context中定義的。*/
ContentResolverresolver=getContentResolver();
/*這里涉及到內容提供者的知識,其實這里是直接在操作Android的資料庫,十分痛苦*/
Cursorcursor=resolver.query(CallLog.Calls.CONTENT_URI,newString[]{"_id"},"number=?and(type=1ortype=3)",newString[]{"15101689022"},"_iddesclimit1");
if(cursor.moveToFirst()){
intid=cursor.getInt(0);
resolver.delete(CallLog.Calls.CONTENT_URI,"_id=?",newString[]{id+""});
}
⑦ android中怎樣聲明操作通話記錄的權利
Android的通話記錄都實現在靜態類android.provider.CallLog.Calls中。
首先需要讀寫通話記錄的的許可權
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
讀取
Cursor cursor = context.getContentResolver()
.query(CallLog.Calls.CONTENT_URI,
new String[] { CallLog.Calls.NUMBER,
CallLog.Calls.CACHED_NAME,
CallLog.Calls.TYPE,
CallLog.Calls.DATE,
CallLog.Calls.DURATION}, null,
null, CallLog.Calls.DEFAULT_SORT_ORDER);
寫入
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, "13200000002");
values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE);
values.put(CallLog.Calls.DATE, System.currentTimeMillis());
values.put(CallLog.Calls.DURATION, 1);
context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values);
解釋一下各欄位的含義:
public static final String NUMBER:電話號碼,TEXT
public static final String TYPE: 通話記錄類型,可為呼入INCOMING_TYPE,呼出OUTGOING_TYPE和未接MISSED_TYPE。
public static final String CACHED_NAME:緩存的聯系人名字, TEXT
public static final String DATE: 發生通話的時間,INTEGER
public static final String DURATION: 通話進行的時間,INTEGER
常用的應該就這么多。
⑧ Android 中TabHost子選項卡里實現Activity跳轉而選項卡不消失
可以的,如果你有源碼可以直接參考contacts中dailpad和calllog的實現。
沒有的話去下載一份吧,一看就懂的 : )
⑨ android 獲取最近聯系人姓名(最佳答案加10分啊)
沒有別的辦法,就是這個笨法
⑩ Android源碼問題,撥打完電話會更新通話記錄列表,通過一個監聽來實現查詢CallLogProvider,有了解的嗎
可以根據Uri來反向查找調用者!