1

我是phonegap的新手。我无法调用phonegap中的插件。我必须获取calllog插件。我已经粘贴了我的代码......

呼叫列表插件

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());
                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);
                System.out.println("CALLLOG"+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;
    }
}

资产-calllog.js

var CallLog = function() {
};

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

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

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

索引.html

<html>
  <head>
    <meta name="viewport" content="target-densitydpi=low-dpi; user-scalable=no" />
    <title>PhoneGap Events Example</title>
    <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script> 
     <script type="text/javascript" charset="utf-8" src="Calllog.js"></script>

      <script type="text/javascript" charset="utf-8">


         function onBodyLoad()
         {
         document.addEventListener("deviceready",onDeviceReady,false);
        }

   function onDeviceReady() {    
        console.log("We got device ready");
        window.plugins.CallListPlugin.list();

        }, function() {
            console.log("fail");
        });
    }


    </script>
  </head>
  <body onload="onBodyLoad();">
    <h2>IMEI v1.5</h2>
    IMEI: <span id="imei"></span><br/>

  </body>
</html>

public class ImeiNumberPhoneGapActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        super.init(); 
        super.appView.getSettings().setJavaScriptEnabled(true);
        super.appView.addJavascriptInterface(this, "Msgbox");
        super.loadUrl("file:///android_asset/www/index.html");  




    }

插件.xml

<plugin>

 <plugin name="CallListPlugin" value="com.gsr.phonegap.CallListPlugin"/>

</plugin>

我正在尝试运行此代码,但在调用插件 nvr 时出现错误。请帮助我解决此问题。感谢您的帮助。

4

1 回答 1

0

您忘记像这样在 calllog.js 中加载插件

 * Load CallListPlugin
 */
cordova.addConstructor(function() {
    cordova.addPlugin("CallListPlugin", new CallListPlugin());
});

以及现在您正在使用Cordova而不是Phonegap。所以像这样 PhoneGap.exec替换它cordova.exec

所以最后你的calllog.js应该是这样的

var CallListPlugin = function() {
};

CallListPlugin.prototype.list = function(params, successCallback, failureCallback) {
    return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'list',
            [ params ]);
};

CallListPlugin.prototype.contact = function(params, successCallback, failureCallback) {
    return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'contact',
            [ params ]);
};

CallListPlugin.prototype.show = function(params, successCallback, failureCallback) {
    return cordova.exec(successCallback, failureCallback, 'CallListPlugin', 'show', 
            [ params ]);
};

* Load CallListPlugin
*/
cordova.addConstructor(function() {
cordova.addPlugin("CallListPlugin", new CallListPlugin());
});
于 2012-07-05T06:07:44.727 回答