2011-06-08 85 views
8

我剛剛開始使用phoneGap和Android。建立基本樣本。PhoneGap API查詢呼叫日誌

我想知道,如果有API來獲取通話記錄。我想創建一個網格顯示:

  • 在一段時間數未接來電的
  • 接來電
  • 電話號碼進行
  • 接電話的總通話時間和號碼進行

在此先感謝。

回答

24

我做了一些研究,並已成功構建了PhoneGap的插件,它會從android.provider.CallLog獲取CallLog。

這將返回一個JSON { Rows: [] }其中Rows是包含以下字段的呼叫記錄的2維陣列(如陣列)按以下順序:

  • 日期(如UNIX時間戳)
  • 號,
  • 類型(1-傳入,傳出的2-,3-錯過)
  • 持續時間(以秒計)
  • 緩存名稱
  • 緩存的數量型
  • 緩存號標籤

詳細信息可在http://developer.android.com/reference/android/provider/CallLog.Calls.html

我已經使用這個插件,它會顯示撥出電話的總數量也做了一個小樣本,錯過來電和來電並將其繪製在餅圖中。該示例正在使用FusionCharts的餅圖。

您可以下載試用版。APK來自:

http://www.sudipto.net/download/android/apps/CallLog/beta/CallChart.apk.zip

(使用JavaScript SVG的圖表,在Android版本3或以上的作品)

這裏是源代碼的郵政編碼爲你深入到:

http://www.sudipto.net/download/android/apps/CallLog/beta/calllog_phonegap_eclipseclassic_source.zip

這是我的完整代碼:

​​

package com.fusioncharts.phonegap.plugin; 

import org.json.*; 

import android.database.*; 
import android.util.Log; 

import com.phonegap.api.Plugin; 
import com.phonegap.api.PluginResult; 
import com.phonegap.api.PluginResult.Status; 

public class CallLog extends Plugin { 

     @Override 
     public PluginResult execute(String actionName, JSONArray arguments, String callback) 
     { 


       JSONObject callLogs = new JSONObject(); 
       PluginResult result = null; 


       try { 
         switch (getActionItem(actionName)) 
         { 
           case 1: 
             callLogs = getAllCallLog(arguments); 
             result = new PluginResult(Status.OK, callLogs); 
             break; 
           default: 
             result = new PluginResult(Status.INVALID_ACTION); 
         } 
       } catch (JSONException jsonEx) { 
         result = new PluginResult(Status.JSON_EXCEPTION); 
       } 



       return result; 
     } 


     private JSONObject getAllCallLog(JSONArray requirements) throws JSONException 
     { 
       JSONObject callLog = new JSONObject(); 

       String[] strFields = { 
         android.provider.CallLog.Calls.DATE, 
         android.provider.CallLog.Calls.NUMBER, 
         android.provider.CallLog.Calls.TYPE, 
         android.provider.CallLog.Calls.DURATION, 
         android.provider.CallLog.Calls.NEW, 
         android.provider.CallLog.Calls.CACHED_NAME, 
         android.provider.CallLog.Calls.CACHED_NUMBER_TYPE, 
         android.provider.CallLog.Calls.CACHED_NUMBER_LABEL//, 
       }; 

       try { 
         Cursor callLogCursor = ctx.getContentResolver().query(
           android.provider.CallLog.Calls.CONTENT_URI, 
           strFields, 
           null, 
           null, 
           android.provider.CallLog.Calls.DEFAULT_SORT_ORDER 
          ); 



       int callCount = callLogCursor.getCount(); 

       if(callCount>0){ 
         JSONArray callLogItem = new JSONArray(); 
         JSONArray callLogItems = new JSONArray(); 

         String[] columnNames = callLogCursor.getColumnNames(); 

         callLogCursor.moveToFirst(); 
         do 
         { 
           callLogItem.put(callLogCursor.getLong(0)); 
           callLogItem.put(callLogCursor.getString(1)); 
           callLogItem.put(callLogCursor.getInt(2)); 
           callLogItem.put(callLogCursor.getLong(3)); 
           callLogItem.put(callLogCursor.getInt(4)); 
           callLogItem.put(callLogCursor.getString(5)); 
           callLogItem.put(callLogCursor.getInt(6)); 
           callLogItems.put(callLogItem); 
           callLogItem = new JSONArray(); 

         }while(callLogCursor.moveToNext()); 

         callLog.put("Rows", callLogItems); 
       } 


       callLogCursor.close(); 
       }catch(Exception e) 
       { 

         Log.d("CallLog_Plugin", " ERROR : SQL to get cursor: ERROR " + e.getMessage()); 
       } 



       return callLog; 
     } 

     private JSONObject getTimeRangeCallLog(JSONArray requirements) 
     { 

     private int getActionItem(String actionName) throws JSONException 
     { 
       JSONObject actions = new JSONObject("{'all':1,'last':2,'time':3}"); 
       if (actions.has(actionName)) 
         return actions.getInt(actionName); 

       return 0; 
     } 
} 

calllog.phonegap.js

var CallLog = function() {}; 
    CallLog.prototype.all = function(params, successCallback, failureCallback) 
    { 
     return PhoneGap.exec(successCallback, failureCallback, 'CallLog', 'all', [params]); 
    }; 

    PhoneGap.addConstructor(function() { 
      PhoneGap.addPlugin("calllog", new CallLog()); 
      PluginManager.addService("CallLog","com.fusioncharts.phonegap.plugin.CallLog"); 
    }); 

Application.java

var CallLog = function() {}; 
CallLog.prototype.all = function(params, successCallback, failureCallback) 
{ 
    /* @param successCallback 
    * @param failureCallback 
    * @param plugin name 
    * @param action 
    * @param JSONArray of parameters 
    */ 
    return PhoneGap.exec(successCallback, failureCallback, 'CallLog', 'all', [params]); 
}; 

PhoneGap.addConstructor(function() { 
     //Register the javascript plugin with PhoneGap 
     PhoneGap.addPlugin("calllog", new CallLog()); 

     //Register the native class of plugin with PhoneGap 
     PluginManager.addService("CallLog","com.fusioncharts.phonegap.plugin.CallLog"); 
}); 
+0

感謝這個重要的答案,你的JS函數返回數組的數組,請你告訴什麼是子數組的內容? – 2014-05-28 15:13:35

+1

JSON爲{行:[]}。你必須談論行數組。行是所有callLog條目的索引數組,因此它是一個數組 - 一行是一個條目。每個條目都是一個索引數組,其中存儲條目的calllog數據。訂單是索引0中的日期; 索引1中的數字,索引2中的索引,索引3中的索引,索引4中的新增索引,索引5中的緩存名稱,索引6中緩存的數字類型,索引7中緩存的數字標籤。這已在上面列出,或者您可以檢查http://developer.android.com/reference/android/provider/CallLog.Calls.html – sudipto 2014-05-29 14:50:55

+0

sudipto,謝謝你的回答。如果我爲strFields指定null,那麼它返回的是sub_id,但不是持續時間,如果我傳遞sub_id,作爲上面的數組中的額外字段,那麼它不會給我任何輸出,我需要duration和sub_id,請幫助我.. – 2014-06-02 11:11:02

4

phonegap中沒有標準的API來實現你想要做的事情,但你總是可以爲你的平臺編寫一個插件並從android API獲取信息。 (我真的不知道你是否可以在android上使用java獲得你需要的信息)。

這裏是如何寫的PhoneGap插件的鏈接:http://wiki.phonegap.com/w/page/36752779/PhoneGap-Plugins