因华为mate7手机在通讯录大小超过1000之后,find方法无法直接获取通讯录,否则通讯录length=0,
所以用v_range的号段作为filter筛选条件,但是filter在ios中无法正常使用
var query_mode = 0; //0 单个号码查询 1 自动加载 2 下拉刷新
/**
- 通讯录读取过程控制
*/
var v_range_point = 0; //当前查询号段
var v_range = ['134',
'135',
'136',
'137',
'138',
'139',
'147',
'150',
'151',
'152',
'157',
'158',
'159',
'170',
'178',
'182',
'183',
'184',
'187',
'188'
]; //号段列表
var v_total_contact_count = 0; //号码总数
var v_weihuanka = 0; //未换卡
var obj_auto = null; //自动读取对象
var v_ios_contact_count = 0;
function initFriendZone() {
if (mui.os.ios) {
initIOSFriendZone();
return;
}
if (v_range_point >= v_range.length) {
//所有号段读取完成
plus.nativeUI.alert('1通讯录已读取完毕!', '操作提示');
stopqueryui(true);
return;
}
var optUsername = plus.storage.getItem(STORAGE_ITEM_NAME);
var optOptMsisdn = plus.storage.getItem(STORAGE_ITEM_MSISDN);
if (optOptMsisdn == undefined || optOptMsisdn == null) {
mui.alert('工号已超时,请尝试再次加载,\n如果仍然提示超时,请退出后重新登录!');
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (plus.contacts == undefined || plus.contacts.ADDRESSBOOK_PHONE == undefined) {
mui.alert("请从系统设置中设置\n开启通讯录访问\n后重试", "权限不足");
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (v_addressbook != undefined && v_addressbook != null) {
var filtercontent = {
filter: [{
logic: "and",
field: "phoneNumbers",
value: '' + v_range[v_range_point] + "?"
}],
multiple: true
};
if (mui.os.ios) {
filtercontent = {
multiple: true
};
v_range_point = v_range.length;
}
v_addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(contacts, function(index, contact) {
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
v_total_contact_count++;
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
// alert(JSON.stringify(current_contact));
for (var i = 0; i < current_contact_index; i += 20) {
var tmp_array = [];
if (i + 20 < current_contact_index) {
tmp_array = current_contact.slice(i, i + 20);
} else {
tmp_array = current_contact.slice(i);
}
queryWithTimeInterval(i, optUsername, optOptMsisdn, tmp_array);
}
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
} else {
var filtercontent = {
filter: [{
logic: "and",
field: "phoneNumbers",
value: '' + v_range[v_range_point] + "?"
}],
multiple: true
};
if (mui.os.ios) {
filtercontent = {
multiple: true
};
v_range_point = v_range.length;
}
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
v_addressbook = addressbook;
v_addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(contacts, function(index, contact) {
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
v_total_contact_count++;
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
for (var i = 0; i < current_contact_index; i += 20) {
var tmp_array = [];
if (i + 20 < current_contact_index) {
tmp_array = current_contact.slice(i, i + 20);
} else {
tmp_array = current_contact.slice(i);
}
queryWithTimeInterval(i, optUsername, optOptMsisdn, tmp_array);
}
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
},
function(e) {
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
mui.alert('获取通讯录操作对象失败\n');
});
}
//读取下一号段
v_range_point++;
}
/
以下是专门针对Ios的通讯录读取方法
/
var v_ios_contact_point = 0;
var v_ios_contact_length = 0;
var v_ios_contact = null;
/**
- ios手机通讯录加载
/
function initIOSFriendZone() {
if (v_ios_contact_length > 0 && v_ios_contact_point >= v_ios_contact_length) {
// plus.nativeUI.alert('通讯录读取完毕!');
stopqueryui(true);
return;
}
var optUsername = plus.storage.getItem(STORAGE_ITEM_NAME);
var optOptMsisdn = plus.storage.getItem(STORAGE_ITEM_MSISDN);
if (optOptMsisdn == undefined || optOptMsisdn == null) {
mui.alert('工号已超时,请尝试再次加载,\n如果仍然提示超时,请退出后重新登录!');
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (plus.contacts == undefined || plus.contacts.ADDRESSBOOK_PHONE == undefined) {
mui.alert("请从系统设置中设置\n开启通讯录访问\n后重试", "权限不足");
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (v_ios_contact != undefined && v_ios_contact != null) {
v_ios_contact_length = v_ios_contact.length;
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
if (v_ios_contact_point + 20 < v_ios_contact.length) {
tmp_contact = v_ios_contact.slice(v_ios_contact_point, v_ios_contact_point + 20)
} else {
tmp_contact = v_ios_contact.slice(v_ios_contact_point);
}
mui.each(tmp_contact, function(index, contact) {
v_ios_contact_point++;
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
queryWithTimeInterval(1 + (Math.round(Math.random() 88) % 4), optUsername, optOptMsisdn, current_contact);
} else {
var filtercontent = {
multiple: true
};
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
v_ios_contact = contacts;
v_ios_contact_length = v_ios_contact.length;
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(v_ios_contact_point + 20 < v_ios_contact.length ? v_ios_contact.slice(v_ios_contact_point, 20) : v_ios_contact.slice(v_ios_contact_point), function(index, contact) {
v_ios_contact_point++;
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
queryWithTimeInterval(1 + (Math.round(Math.random() * 88) % 4), optUsername, optOptMsisdn, current_contact);
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
},
function(e) {
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
mui.alert('获取通讯录操作对象失败\n');
});
}
}
2 个回复
DCloud_IOS_XTY
经测试未发现phoneNumbers采用id进行匹配的问题,请提供详细的有问题的代码
二八中医 (作者)
因华为mate7手机在通讯录大小超过1000之后,find方法无法直接获取通讯录,否则通讯录length=0,
所以用v_range的号段作为filter筛选条件,但是filter在ios中无法正常使用
var query_mode = 0; //0 单个号码查询 1 自动加载 2 下拉刷新
/**
*/
var v_range_point = 0; //当前查询号段
var v_range = ['134',
'135',
'136',
'137',
'138',
'139',
'147',
'150',
'151',
'152',
'157',
'158',
'159',
'170',
'178',
'182',
'183',
'184',
'187',
'188'
]; //号段列表
var v_total_contact_count = 0; //号码总数
var v_weihuanka = 0; //未换卡
var obj_auto = null; //自动读取对象
var v_ios_contact_count = 0;
function initFriendZone() {
if (mui.os.ios) {
initIOSFriendZone();
return;
}
if (v_range_point >= v_range.length) {
//所有号段读取完成
plus.nativeUI.alert('1通讯录已读取完毕!', '操作提示');
stopqueryui(true);
return;
}
var optUsername = plus.storage.getItem(STORAGE_ITEM_NAME);
var optOptMsisdn = plus.storage.getItem(STORAGE_ITEM_MSISDN);
if (optOptMsisdn == undefined || optOptMsisdn == null) {
mui.alert('工号已超时,请尝试再次加载,\n如果仍然提示超时,请退出后重新登录!');
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (plus.contacts == undefined || plus.contacts.ADDRESSBOOK_PHONE == undefined) {
mui.alert("请从系统设置中设置\n开启通讯录访问\n后重试", "权限不足");
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (v_addressbook != undefined && v_addressbook != null) {
var filtercontent = {
filter: [{
logic: "and",
field: "phoneNumbers",
value: '' + v_range[v_range_point] + "?"
}],
multiple: true
};
if (mui.os.ios) {
filtercontent = {
multiple: true
};
v_range_point = v_range.length;
}
v_addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(contacts, function(index, contact) {
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
v_total_contact_count++;
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
// alert(JSON.stringify(current_contact));
for (var i = 0; i < current_contact_index; i += 20) {
var tmp_array = [];
if (i + 20 < current_contact_index) {
tmp_array = current_contact.slice(i, i + 20);
} else {
tmp_array = current_contact.slice(i);
}
queryWithTimeInterval(i, optUsername, optOptMsisdn, tmp_array);
}
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
} else {
var filtercontent = {
filter: [{
logic: "and",
field: "phoneNumbers",
value: '' + v_range[v_range_point] + "?"
}],
multiple: true
};
if (mui.os.ios) {
filtercontent = {
multiple: true
};
v_range_point = v_range.length;
}
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
v_addressbook = addressbook;
v_addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(contacts, function(index, contact) {
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
v_total_contact_count++;
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
for (var i = 0; i < current_contact_index; i += 20) {
var tmp_array = [];
if (i + 20 < current_contact_index) {
tmp_array = current_contact.slice(i, i + 20);
} else {
tmp_array = current_contact.slice(i);
}
queryWithTimeInterval(i, optUsername, optOptMsisdn, tmp_array);
}
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
},
function(e) {
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
mui.alert('获取通讯录操作对象失败\n');
});
}
//读取下一号段
v_range_point++;
}
/
以下是专门针对Ios的通讯录读取方法
/
var v_ios_contact_point = 0;
var v_ios_contact_length = 0;
var v_ios_contact = null;
/**
/
function initIOSFriendZone() {
if (v_ios_contact_length > 0 && v_ios_contact_point >= v_ios_contact_length) {
// plus.nativeUI.alert('通讯录读取完毕!');
stopqueryui(true);
return;
}
var optUsername = plus.storage.getItem(STORAGE_ITEM_NAME);
var optOptMsisdn = plus.storage.getItem(STORAGE_ITEM_MSISDN);
if (optOptMsisdn == undefined || optOptMsisdn == null) {
mui.alert('工号已超时,请尝试再次加载,\n如果仍然提示超时,请退出后重新登录!');
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (plus.contacts == undefined || plus.contacts.ADDRESSBOOK_PHONE == undefined) {
mui.alert("请从系统设置中设置\n开启通讯录访问\n后重试", "权限不足");
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
return;
}
if (v_ios_contact != undefined && v_ios_contact != null) {
v_ios_contact_length = v_ios_contact.length;
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
if (v_ios_contact_point + 20 < v_ios_contact.length) {
tmp_contact = v_ios_contact.slice(v_ios_contact_point, v_ios_contact_point + 20)
} else {
tmp_contact = v_ios_contact.slice(v_ios_contact_point);
}
mui.each(tmp_contact, function(index, contact) {
v_ios_contact_point++;
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
queryWithTimeInterval(1 + (Math.round(Math.random() 88) % 4), optUsername, optOptMsisdn, current_contact);
} else {
var filtercontent = {
multiple: true
};
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
v_ios_contact = contacts;
v_ios_contact_length = v_ios_contact.length;
//清空原有朋友圈数据
var current_contact = [];
var current_contact_index = 0;
mui.each(v_ios_contact_point + 20 < v_ios_contact.length ? v_ios_contact.slice(v_ios_contact_point, 20) : v_ios_contact.slice(v_ios_contact_point), function(index, contact) {
v_ios_contact_point++;
var displayname = contact.displayName;
if (contact.phoneNumbers == null) {
return;
}
mui.each(contact.phoneNumbers, function(idx_number, number) {
//兼容ios上号码自带的 - 符号或者前置的 +86区号
var cur_msisdn = "" + number.value;
cur_msisdn = cur_msisdn.replace(/-/gi, "").replace('+86', "").replace(/ /g, '').trim();
// 过度过滤,有些号码被过滤掉。
if (!TEL_REG.test(cur_msisdn)) {
//过滤无效手机号码
return;
}
//对于有效号码,记录号码
current_contact[current_contact_index++] = {
msisdn: cur_msisdn,
name: displayname
};
});
});
content_sxyw = plus.storage.getItem(option_content_sxyw);
//分次加载这个号段的所有号码
if (current_contact_index <= 0) {
stopqueryui();
return;
}
queryWithTimeInterval(1 + (Math.round(Math.random() * 88) % 4), optUsername, optOptMsisdn, current_contact);
},
function(e) {
mui.alert("本次联系人加载失败 " +
e.message);
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
}, filtercontent);
},
function(e) {
//注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
stopqueryui(true);
mui.alert('获取通讯录操作对象失败\n');
});
}
}
DCloud_IOS_XTY
你的问题是啥查询不出内容吗
2015-07-16 11:11
二八中医 (作者)
一样的filter,android上可以按照号段条件分次获取通讯录,ios上就不可以,每次只能获取id=指定号段的联系人,还有就是华为Mate7上,当通讯录在2000个左右或者更多时,不加任何条件直接find获取的联系人是0,必须加上其他条件缩小find匹配的联系人数量才可以
2015-07-17 09:30
DCloud_IOS_XTY
就是说通过phoneNumbers查询不出任何纪录,每次只能获取id=指定号段的联系人这个是什么意思
2015-07-17 11:49
二八中医 (作者)
是的
2015-07-27 09:53