【问题标题】:PhoneGap API to query call-logsPhoneGap API 查询通话记录
【发布时间】:2011-06-08 10:15:31
【问题描述】:

我刚刚开始使用 phoneGap 和 Android。构建基本示例。

我想知道,是否有获取通话记录的 API。我希望创建一个网格显示:

  • 一段时间内的未接电话数
  • 接听电话数
  • 调用次数
  • 接听电话和拨打电话的总时间

提前致谢。

【问题讨论】:

    标签: android eclipse cordova


    【解决方案1】:

    我做了一些研究,并成功构建了一个 PhoneGap 插件,它可以从 android.provider.CallLog 获取 CallLog。

    这将返回一个 JSON { Rows: [] },其中 Rows 是一个二维的通话记录数组,包含按以下顺序排列的以下字段(作为数组):

    • 日期(作为 UNIX 时间戳)
    • 号码,
    • 类型(1-传入,2-传出,3-未接)
    • 持续时间(以秒为单位)
    • 缓存名称
    • 缓存数字类型
    • 缓存数字标签

    详情在http://developer.android.com/reference/android/provider/CallLog.Calls.html

    我还使用此插件制作了一个小示例,它将显示拨出电话、未接电话和来电的总数,并将它们绘制在饼图中。示例使用的是 FusionCharts 的饼图。

    您可以从以下网址下载 beta 试用版 .apk:

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

    (使用适用于 Android 3 或更高版本的 JavaScript SVG 图表)

    这里是源代码 zip 供您深入研究:

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

    这是我的完整代码:

    CallLog.java

    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");
    });
    

    【讨论】:

    • 感谢您的重要回答,您的JS函数返回数组数组,请您告诉子数组的内容是什么??
    • JSON 格式为 { Rows: [] }。您一定在谈论行数组。 Rows 是所有 callLog 条目的索引数组,因此它是一个数组 - 一行是一个条目。每个条目都是一个索引数组,其中存储条目的调用日志数据。顺序是索引 0 中的日期;索引1中的数字,索引2中的类型,索引3中的持续时间,索引4中的新,索引5中的缓存名称,索引6中的缓存数字类型,索引7中的缓存数字标签。上面已经列出了或者你可以检查@ 987654324@
    • sudipto,感谢您的回答。如果我为 strFields 分配 null 然后它返回 sub_id,但不返回持续时间,如果我将 sub_id 作为上述数组中的额外字段传递,那么它没有给我任何输出,我需要持续时间和 sub_id,请帮助我..
    • 你需要从developer.android.com/reference/android/provider/…挖掘API并需要尝试。
    【解决方案2】:

    phonegap 中没有标准的 API 来实现你想做的事情,但你总是可以为你的平台编写一个插件并从 android API 获取信息。 (我实际上不知道您是否可以在 android 上使用 java 获得所需的信息)。

    这是一个关于如何编写phonegap插件的链接:http://wiki.phonegap.com/w/page/36752779/PhoneGap-Plugins

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多