Andriod phonegap(Cordova)获得通话记录中的信息

今天上海天气不错哈,18楼能望到东方明珠但看不到虹口足球场,着实有点遗憾~~不过今天phonegap有了大突破,又收获了一个获得通话log的插件。

1.引入.java和.js文件

/**
 * Example of Android PhoneGap Plugin
 */
package com.tricedesigns;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.EmptyStackException;

import org.apache.cordova.api.PluginResult.Status;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;
import android.provider.Contacts;
import android.provider.ContactsContract;
import android.text.format.DateFormat;
import android.util.Log;

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


/**
 * Grab call log data
 * 
 * @author James Hornitzky
 */
public class CallListPlugin extends Plugin {

	/** List Action */
	private static final String ACTION = "list";
	private static final String CONTACT_ACTION = "contact";
	private static final String SHOW_ACTION = "show";
	private static final String TAG = "CallListPlugin";

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.phonegap.api.Plugin#execute(java.lang.String,
	 * org.json.JSONArray, java.lang.String)
	 */
	@Override
	public PluginResult execute(String action, JSONArray data, String callbackId) {
		Log.d(TAG, "Plugin Called");
		PluginResult result = null;
		if (ACTION.equals(action)) {
			try {
				int limit = -1;
				
				//obtain date to limit by
				if (!data.isNull(0)) {
					String d = data.getString(0);
					Log.d(TAG, "Time period is: " + d);
					if (d.equals("week"))
						limit = -7;
					else if (d.equals("month"))
						limit = -30;
					else if (d.equals("all"))
						limit = -1000000; // LOL
				} 
				
				//turn this into a date
				Calendar calendar = Calendar.getInstance();
				calendar.setTime(new Date());
				calendar.add(Calendar.DAY_OF_YEAR, limit);
				Date limitDate = calendar.getTime();
				String limiter = String.valueOf(limitDate.getTime());
				
				//now do required search
				JSONObject callInfo = getCallListing(limiter);
				Log.d(TAG, "Returning " + callInfo.toString());
				//Log.d(TAG,callInfo);
				result = new PluginResult(Status.OK, callInfo);
			} catch (JSONException jsonEx) {
				Log.d(TAG, "Got JSON Exception " + jsonEx.getMessage());
				result = new PluginResult(Status.JSON_EXCEPTION);
			}
		} else if (SHOW_ACTION.equals(action)) {
			try {
				if (!data.isNull(0)) {
					viewContact(data.getString(0));
				} 
			} catch (JSONException jsonEx) {
				Log.d(TAG, "Got JSON Exception " + jsonEx.getMessage());
				result = new PluginResult(Status.JSON_EXCEPTION);
			} catch (Exception e) {}
		} else if (CONTACT_ACTION.equals(action)) {
			try {
				String contactInfo = getContactNameFromNumber(data.getString(0));
				Log.d(TAG, "Returning " + contactInfo.toString());
				result = new PluginResult(Status.OK, contactInfo);
			} catch (JSONException jsonEx) {
				Log.d(TAG, "Got JSON Exception " + jsonEx.getMessage());
				result = new PluginResult(Status.JSON_EXCEPTION);
			}
		} else {
			result = new PluginResult(Status.INVALID_ACTION);
			Log.d(TAG, "Invalid action : " + action + " passed");
		}
		return result;
	}

	/**
	 * Gets the Directory listing for file, in JSON format
	 * 
	 * @param file
	 *            The file for which we want to do directory listing
	 * @return JSONObject representation of directory list. e.g
	 *         {"filename":"/sdcard"
	 *         ,"isdir":true,"children":[{"filename":"a.txt"
	 *         ,"isdir":false},{...}]}
	 * @throws JSONException
	 */
	private JSONObject getCallListing(String period) 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,
					CallLog.Calls.DATE + ">?",
	                new String[] {period},
					android.provider.CallLog.Calls.DEFAULT_SORT_ORDER);

			int callCount = callLogCursor.getCount();

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

				callLogCursor.moveToFirst();
				do {
					callLogItem.put("date", callLogCursor.getLong(0));
					callLogItem.put("number", callLogCursor.getString(1));
					callLogItem.put("type", callLogCursor.getInt(2));
					callLogItem.put("duration", callLogCursor.getLong(3));
					callLogItem.put("new", callLogCursor.getInt(4));
					callLogItem.put("cachedName", callLogCursor.getString(5));
					callLogItem.put("cachedNumberType", callLogCursor.getInt(6));
					//callLogItem.put("name", getContactNameFromNumber(callLogCursor.getString(1))); //grab name too
					callLogItems.put(callLogItem);
					callLogItem = new JSONObject(); 
				} 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;
	}
	
	/**
	 * Show contact data based on id
	 * @param number
	 */
	private void viewContact(String number) {
		Intent i = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, 
				Uri.parse(String.format("tel: %s", number)));
		this.ctx.startActivity(i);
	}
	
	
	/**
	 * Util method to grab name based on number
	 * 
	 */
	private String getContactNameFromNumber(String number) {
		// define the columns I want the query to return
		String[] projection = new String[] { Contacts.Phones.DISPLAY_NAME, Contacts.Phones.NUMBER };

		// encode the phone number and build the filter URI
		Uri contactUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, Uri.encode(number));

		// query time
		Cursor c = ctx.getContentResolver().query(contactUri, projection, null, null, null);

		// if the query returns 1 or more results
		// return the first result
		if (c.moveToFirst()) {
			String name = c.getString(c.getColumnIndex(Contacts.Phones.DISPLAY_NAME));
			c.deactivate();
			return name;
		}

		// return the original number if no match was found
		return number;
	}
}

2. calllog.js文件放在assert-》www文件中

var CallLog ={
        list:function(params, successCallback, failureCallback) {
            return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'list',
                    [ params ]);
        },
        contact:function(params, successCallback, failureCallback) {
            return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'contact',
                    [ params ]);
        },
        show:function(params, successCallback, failureCallback) {
            return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'show',
                    [ params ]);
        }
 
};


然后开始例行公事:

3.在plugin.xml中添加语句(记得修改packageName)


4. 定义调用的js

function aaa(){
         
        CallLog.list('all', function(data){
            //console.log(data);
            alert(data.rows.length);
            alert(data.rows[0].cachedName)
            //for(var i=0;i<=data.rows.length)
            //alert(data.rows.cachedName);
            }, function(){});
    }

5.效果如下:项目下载可进我的qq群共享( 250395324



你可能感兴趣的:(phonegap)