无法在 Phonegap / Cordova 3.5.0-0.2.4 上运行联系人插件

Posted

技术标签:

【中文标题】无法在 Phonegap / Cordova 3.5.0-0.2.4 上运行联系人插件【英文标题】:Unable to run Contacts plugin on Phonegap / Cordova 3.5.0-0.2.4 【发布时间】:2014-07-20 11:17:39 【问题描述】:

尝试使用 Phonegap / Cordova 3.5.0-0.2.4 列出 android 手机中的联系人,将“联系人”插件安装到应用程序文件夹中。

运行下面的步骤序列后,我们会得到一个默认的cordova索引页面显示在 带有消息“正在连接设备”

的设备

它不显示存储在手机上的联系人。

请帮助我们。提前致谢。

Step1
$ cordova create conto com.example.conto

Step2
$ cordova platform add android

Step3
$ cordova plugin add org.apache.cordova.contacts

Step4
$ cordova plugin list (enter)
org.apache.cordova.contacts 0.2.11 "Contacts"

Step5
Added the following in "app/www/js/index.js"

function read_contacts()
   var options = new ContactFindOptions();
   options.filter="";
   options.filter="";
   options.multiple=true;
   var fields = ["*"];  //"*" will return all contact fields
   navigator.contacts.find(fields, onSuccess, onError, options);


// display the address information for all contacts
function onSuccess(contacts) 
  //console.log(JSON.stringify(contacts))
   var li = '';
   $.each(contacts, function(key, value) 
        if(value.name)
            $.each(value.name, function(key, value) 
               if(key == 'formatted')
                   name = value;
                                     
            );
        
        if(value.phoneNumbers)
            $.each(value.phoneNumbers, function(key, value) 
                phone = value.value;
            );
                            
        li += '<li style="text-decoration:none;">'+name+' '+phone+'</li>';
   ); 

   $("#contact").html(li);   


function onError(contactError) 
   alert('onError!');


Step6:
Added the following in "app/www/index.html"



            <ol id="contact"></ol>


Step7
Added the following in app/res/xml/config.xml
<feature name="Contacts">
    <param name="android-package" value="org.apache.cordova.contacts.ContactManager" />
</feature>



 Step8
   Added the following in app/AndroidManifest.xml
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />


    Step9
    $ cordova run android 

【问题讨论】:

你试过调试它吗?做adb logcat的时候有没有报错? 你在哪里调用 read_contacts 函数?到处都找不到。 你忘了粘贴吗? 我们如何调试 Cordova 项目? Eclispe-console-Logcat 输出:docs.google.com/document/d/… 另外我们把函数名从read_contacts改成了“onDeviceReady()”,问题依旧 【参考方案1】:

在 Adroid 上,我通过 onSuccess 和字段交换成功测试,如下所示:

navigator.contacts.find(onSuccess, onError, fields, options);

这与手册相矛盾,但它有效。

在“开发者应用程序”中,它按照手册中的说明工作...

【讨论】:

【参考方案2】:

如果您正在修改给定应用程序,请尝试了解它的结构。 在这种情况下,“空”cordova 项目在 index.js 中有一个 app-Object,它处理事件并隐藏(也给定的)Splash-Screen。

您只是删除了 index.js 中的所有代码,但在 index.html 中保留了相应的元素。

这就是您的 index.js 应该如何工作(基于默认的 cordova 项目和您的代码,未经测试)

var app = 
    initialize: function() 
        this.bindEvents();
    ,
    bindEvents: function() 
        document.addEventListener('deviceready', this.onDeviceReady, false);
    ,
    onDeviceReady: function() 
        app.receivedEvent('deviceready');
        app.openContacts();
    ,
    receivedEvent: function(id) 
        console.log('Received Event: ' + id);
    ,
    openContacts:function()
        var options = new ContactFindOptions();
        options.filter="";
        options.filter="";
        options.multiple=true;
        var fields = ["*"];  //"*" will return all contact fields
        navigator.contacts.find(fields, app.onSuccess, app.onError, options);
    ,
    onSuccess:function(contacts) 
        //console.log(JSON.stringify(contacts))
        var li = '';
        $.each(contacts, function(key, value) 
            if(value.name)
                $.each(value.name, function(key, value) 
                   if(key == 'formatted')
                       name = value;
                                         
                );
            
            if(value.phoneNumbers)
                $.each(value.phoneNumbers, function(key, value) 
                    phone = value.value;
                );
                                
            li += '<li style="text-decoration:none;">'+name+' '+phone+'</li>';
        ); 
        $("#contact").html(li);   
    ,
    onError:function(contactError) 
        alert('onError!');
    
;

【讨论】:

把www/js/index.js换成上面的代码还是一样,我的app/www/index.html和app/www/js/index.js是:docs.google.com/document/d/…。我是这个环境的新手,请提供正确的 index.html 和 js/index.js 并指出任何其他错误(如果有)。 请再次检查错误日志(adb logcat)。那些包含科尔多瓦的行可能很有趣。启动画面是否仍然显示? 有一些进展,logcat output(docs.google.com/document/d/…)显示了手机里的通讯录但是手机屏幕上的实际输出是闪屏还是原封不动,屏幕没有变化(不显示通讯录我可以在 logcat 输出中看到) 好的。 a) 如果你想使用它,你应该包括 jQuery。 b) 您可以简单地删除默认的&lt;p class="event listening"&gt;Connecting to Device&lt;/p&gt;&lt;p class="event received"&gt;Device is Ready&lt;/p&gt;。 “默认行为”(如上所用)仅隐藏“侦听”屏幕,但显示“就绪”屏幕。我将编辑答案以匹配此。 好的,找不到原因。由于它显示的 html 肯定已被评论,因此请尝试清理所有内容(从 eclipse 中),从设备中删除应用程序并重新开始。如果它不起作用,请尝试使用 chrome 或 weinre 的远程 Web 检查器(有大量教程),并尝试在正在运行的应用程序中编辑某些内容。

以上是关于无法在 Phonegap / Cordova 3.5.0-0.2.4 上运行联系人插件的主要内容,如果未能解决你的问题,请参考以下文章

无法为我的 ionic 3 应用程序安装 cordova phonegap-push-plugin

无法构建或编译 phonegap 2.1

Cordova/Phonegap:无法让 Facebook Phonegap 插件工作

Cordova/Phonegap 构建无法找到 HTML 模板

Cordova/Phonegap 无法识别 FileTransfer

Phonegap 构建:“无法复制 cordova.js”