【问题标题】:unable to display contact data image in phonegap无法在 phonegap 中显示联系人数据图像
【发布时间】:2013-08-26 16:53:35
【问题描述】:

我正在尝试使用PhoneGap 中的以下代码为android 获取联系人资料图片,即联系人数据的头像 但我得到了以下网址作为回报,我不知道应该如何在 img 标签中显示它。

代码

  var defaultImagePath ='../resources/images/default_usr.png'

 var img = contacts[i].photos  != null ? 
     contacts[i].photos[0].value : defaultImagePath;

返回的网址是

content://com.android.contacts/contacts/739/photo

现在,当最终在列表中时,我尝试使用

显示它
<img src="content://com.android.contacts/contacts/739/photo"/>

但它没有显示任何东西?那么我将如何显示联系人图片?

我有最新的PhoneGap 版本

我用过

window.resolveLocalFileSystemURI(contacts[i].photos[0].value, this.onResolveSuccess, this.fail);

但我得到以下运行时错误

JNI ERROR (app bug): attempt to use stale local reference in phonegap

即使我在 android 中指定了以下权限

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />

更新

loadContacts:function(){



    var arr = [];

    var filter = ["displayName", "name", "phoneNumbers","emails","addresses","photos"];
    var options = new ContactFindOptions();
    options.filter=""; 
    options.multiple=true;    

    navigator.contacts.find(filter,
              function(contacts) {

                for (var i = 0; i < contacts.length; i++) {
                  if (contacts[i].photos) {


                     for (var j = 0; j < contacts[i].photos.length; j++) {



                                returnValidPhoto(contacts[i].photos[j], function(answer) {

                                        console.log(answer);

                                        if(contacts[i].photos[j]!=null);
                                         contacts[i].photos[j].value=answer;


                                    });




                                 var contactData = new ContactData("Name" ,
                                                    "09090909",
                                                     contacts[i].photos[j].value);

                                arr.push(contactData);




                  }
                }

            }
            Ext.getStore('ContactStore').setData(arr);

               // document.getElementById("contactdata").innerHTML = data; 
            }, function(err) {
                alert(err);
              },options);



    }

这里是图片功能

 function returnValidPhoto(url,callback){

    console.log("IMAGE CALLED");
    var img = new Image();
    img.onload = function() {
    //Image is ok

        console.log("IMAGE OK");

        callback(url.value);
    };
    img.onerror = function(err) {
        //Returning a default image for users without photo 

                console.log("IMAGE FAILED");

        url.value = "/resources/images/default_usr.png";
        callback("/resources/images/default_usr.png");
    }
    img.src = url.value;
};

【问题讨论】:

  • 你解决了吗?我也有同样的问题,联系方式没有显示...

标签: android cordova


【解决方案1】:

请试试这个。

     function onDeviceReady() {
            window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);
            window.resolveLocalFileSystemURI("content://com.android.contacts/contacts/739/photo", onResolveSuccess, fail);
        }

        function onFileSystemSuccess(fileSystem) {
            console.log(fileSystem.name);
        }

        function onResolveSuccess(fileEntry) {
            console.log(fileEntry.name);
        }

        function fail(evt) {
            console.log(evt.target.error.code);
        }

【讨论】:

  • 如果我使用上面的代码JNI ERROR (app bug): attempt to use stale local reference in phonegap 并且应用程序停止,我会收到以下错误,请参阅我的编辑
  • 您好,您是否添加了 权限
  • 以及 AndoidMainfeast.xml 中的 debuggable="true"
  • 是的,我的权限已经存在,我在设置debuggable 后尝试过,但结果相同,你最后试过了吗?
  • 你用的是3.0.0版本
【解决方案2】:

几天前我遇到了这个问题,终于找到了解决方法。

var returnValidPhoto=function(url,callback){
    var img = new Image();
    img.onload = function() {
    //Image is ok
        callback(url);
    };
    img.onerror = function(err) {
        //Returning a default image for users without photo 
        callback("image_for_no_avatar.png");
    }
    img.src = url;
};

//Example usage
returnValidphoto(contact.photos[0].value, function(answer) {
    contact.photos[0].value=answer;
}

【讨论】:

  • 当我设置 contact.photos[0].value=answer; 我收到错误 cant read property 'photos' of undefined
  • 你应该检查它是否也被定义了,phonegap中的大多数联系人都有photos=null。
  • 对我来说,在完成 navigator.contacts.find 并过滤所有没有电话号码或姓名和设置默认照片的人之后,我正在构建一个新的“validContacts”数组
  • 谢谢,这对我来说非常有效。我没有使用回调,而是将联系人(用户模型)传递给函数,并在出错时将模型的图片属性更新为默认值。然后在我已经渲染这个用户的视图中,我监听图片属性的变化并重新渲染。
【解决方案3】:

除了AndroidManifest.xml,还有project\res\xml\config.xml的phonegap权限

 <plugins>
    <plugin name="App" value="org.apache.cordova.App"/>
    <plugin name="Device" value="org.apache.cordova.Device"/>
    <plugin name="Camera" value="org.apache.cordova.CameraLauncher"/>
    <plugin name="Contacts" value="org.apache.cordova.ContactManager"/>
    <plugin name="File" value="org.apache.cordova.FileUtils"/>
    <plugin name="Storage" value="org.apache.cordova.Storage"/>
    ...
  </plugins>

请检查是否为 JNI ERROR 授予了所有权限,该错误可能是权限错误。

对于图片,&lt;img src="content://com.android.contacts/contacts/739/photo"/&gt; 确保联系人 id 739 已设置图片,因为 phonegap get_contact 函数始终返回类似content://com.android.contacts/contacts/XXX/photo 的 url 格式,其中 XXX 是联系人 id,无论是否设置了图片。

当我在 android 4 上使用 phonegap 2.5 进行测试时,&lt;img src="content://com.android.contacts/contacts/739/photo"/&gt; 可以工作,如果 uri 不包含图片,请联系图片或带有问号的小蓝色正方形

【讨论】:

  • 它现在可以工作了,但是我遇到了区分 null 和 image 的问题,并且该插件是唯一的选择?
  • 是的,据我所知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多