调用官方提供的联系人jar获取方法在大量联系人存在的情况下(20K左右)报空指针异常

调用官方提供的联系人jar获取方法在大量联系人存在的情况下(20K左右)报空指针异常

示例代码:

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, book => {    
  // 可通过addressbook进行通讯录操作    
  book.find(contactFields, list => {    
    const queryFinishTime = new Date().getTime();    
    const rst = dealData(list);    
    const now = new Date().getTime();    
    logger.info(`Query contact finish! count: ${rst.length}, ` +    
      `query cost: ${queryFinishTime - startTime}, ` +    
      `deal cost: ${now - queryFinishTime}ms, ` +    
      `total cost: ${now - startTime}ms`);    
    resolve(rst);    
  }, (e) => {    
    logger.error("Failed to get contacts:" + e.message);    
    resolve([]);    
  }, findOpts)    
}, e => {    
  logger.error("Failed to get address book: " + e.message);    
  resolve([])    
});

操作步骤:

  • 前置条件:
    • 调用代码示例中的获取联系人的方法
    • 手机中联系人数量在20k左右
    • 机型为: Samsung Galaxy S22 Ultra,Android 14

在上述条件下, 调用获取联系人, 发现非常慢; 而且出现了空指针异常

预期结果:

能够正常获取到联系人信息

实际结果:

APP崩溃, crash日志如下:

BOARD: msmnile    
BOOTLOADER: G970USQS3CTA3    
BRAND: samsung    
CPU_ABI: arm64-v8a    
CPU_ABI2:    
DEVICE: beyond0q    
DISPLAY: QP1A.190711.020.G970USQS3CTA3    
FINGERPRINT: samsung/beyond0qltesq/beyond0q:10/QP1A.190711.020/G970USQS3CTA3:user/release-keys    
HARDWARE: qcom    
HOST: 21HH1G24    
ID: QP1A.190711.020    
IS_DEBUGGABLE: false    
IS_EMULATOR: false    
MANUFACTURER: samsung    
MODEL: SM-G970U    
PERMISSIONS_REVIEW_REQUIRED: true    
PRODUCT: beyond0qltesq    
RADIO: unknown    
SERIAL: unknown    
SUPPORTED_32_BIT_ABIS: [Ljava.lang.String;@c7611f8    
SUPPORTED_64_BIT_ABIS: [Ljava.lang.String;@58f66d1    
SUPPORTED_ABIS: [Ljava.lang.String;@608a536    
TAGS: release-keys    
TIME: 1579307533000    
TYPE: user    
UNKNOWN: unknown    
USER: dpi    
java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference    
    at io.dcloud.feature.contacts.ContactAccessorImpl.populateContactArray(ContactAccessorImpl.java:209)    
    at io.dcloud.feature.contacts.ContactAccessorImpl.search(ContactAccessorImpl.java:175)    
    at io.dcloud.feature.contacts.JsContactsMgr.execute(JsContactsMgr.java:82)    
    at io.dcloud.feature.contacts.ContactsFeatureImpl$1.run(ContactsFeatureImpl.java:29)

bug描述:

调用官方的联系人sdk查询联系人, 报空指针异常; 目标手机联系人数量比较多, 大概20k左右; 接口效率很慢, 同时在报错;


1 回复

从错误日志来看,这是一个典型的Android联系人查询性能问题导致的空指针异常。当联系人数量过大(20K)时,系统Cursor查询可能超时返回null,而代码未做判空处理。

建议优化方案:

  1. 分批查询:使用findOpts参数设置offset和limit,分页获取联系人
let findOpts = {
  offset: 0,
  limit: 1000
}
  1. 减少查询字段:contactFields只包含必要字段

  2. 添加错误处理:

book.find(contactFields, list => {
  if(!list) {
    logger.error("Contacts data is null");
    resolve([]);
    return;
  }
  // 处理数据
}, ...)
回到顶部