公司“单位通讯录”项目
这个是公司的项目哟
,其中界面我修改了,不可能跟公司的一样撒!
所以不要吐槽我的UI了。
项目介绍:
获取手机上的联系人信息(SIM卡的不考虑,用的人少。)
获取手机上联系人群组信息(主要就是实现这个功能,有些人会用群组的。)
单位通讯录导入(就是单位的通讯录拉,联系人太多客户不想把这些存在手机上。所以我们直接用TXT读取。)
以字母排序的列表(仿Iphone的效果)
来电显示人名(因为单位通讯录的人没在手机上存储,所以当单位通讯录中的联系人来电时,显示人名)
首先就是做获取手机上的所有联系人,这个非常简单啦,网上一大顿我就不说了!这里做了一个处理,就是模糊查询联系人时,用拼音首字母和电话号码。具体的在代码中看吧!

在做手机联系人分组的时候,在网上看了一下。有直接在数据库里连接查询的。但是发现当数据量大的时候,速度会很慢,于是想到了。用组ID查这个组下面的联系人RAW_CONTACT_ID这个查询速度会非常快。再用每个组下面的联系人RAW_CONTACT_ID,在全部联系人中找。有这个RAW_CONTACT_ID就表示是这个组下面的联系人,在取出名字和电话!在数据大的时候,这个可以解决查询慢的问题。
做单位通讯录导入的时候,最先想到的就是读文件。没什么好说的,直接上代码。读取之后是建立数据库的,这样方便操作。文件类型为TXT,最先我想以后更新单位通讯录数据的时候,直接把TXT文件放到SD卡上把,日期一改就可以自动更新,但是客户说不用了,所以取消了。不过代码没删!
接下来就是对数据库进行操作了,这个就不说了,自己怎么建的数据库,就怎么操作!不懂的就大家交流一下...
来电显示人名,这个的最先听师兄说来电界面,都是系统在数据库里查询显示出来的。这个可以在来电界面数据库里面添加进去,然后来电画面就可以显示了。但是研究了很久都没进展。所以果断用覆盖图层的方式。。这个是我在网上找的,他是仿Iphone的界面来做全覆盖。我把它变成类似于360等软件的来电显示归属地那种了!
发帖字数限制。没办法全部贴出来。最后想要源码的就留邮箱咯!公司项目没办法呀!

,其中界面我修改了,不可能跟公司的一样撒!
所以不要吐槽我的UI了。项目介绍:
获取手机上的联系人信息(SIM卡的不考虑,用的人少。)
获取手机上联系人群组信息(主要就是实现这个功能,有些人会用群组的。)
单位通讯录导入(就是单位的通讯录拉,联系人太多客户不想把这些存在手机上。所以我们直接用TXT读取。)
以字母排序的列表(仿Iphone的效果)
来电显示人名(因为单位通讯录的人没在手机上存储,所以当单位通讯录中的联系人来电时,显示人名)
首先就是做获取手机上的所有联系人,这个非常简单啦,网上一大顿我就不说了!这里做了一个处理,就是模糊查询联系人时,用拼音首字母和电话号码。具体的在代码中看吧!


在做手机联系人分组的时候,在网上看了一下。有直接在数据库里连接查询的。但是发现当数据量大的时候,速度会很慢,于是想到了。用组ID查这个组下面的联系人RAW_CONTACT_ID这个查询速度会非常快。再用每个组下面的联系人RAW_CONTACT_ID,在全部联系人中找。有这个RAW_CONTACT_ID就表示是这个组下面的联系人,在取出名字和电话!在数据大的时候,这个可以解决查询慢的问题。

/**
* 查询分组的联系人方法 groupID是分组的id
*
* @param groupID
* @return
*/
private List<Long> getContactsIDsByGroup(long groupID) {
List<Long> list = new ArrayList<Long>();
// 思路 我们通过组的id 去查询 RAW_CONTACT_ID, 通过RAW_CONTACT_ID去查询联系人
// 要查询得到 data表的Data.RAW_CONTACT_ID字段
String RAW_CONTACTS_WHERE = CommonDataKinds.GroupMembership.GROUP_ROW_ID
+ "=?"
+ " and "
+ ContactsContract.Data.MIMETYPE
+ "="
+ "'"
+ CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE + "'";
// 通过分组的id outid;查询得到RAW_CONTACT_ID
Cursor cursor = resolver.query(Data.CONTENT_URI,
new String[] { Data.RAW_CONTACT_ID }, RAW_CONTACTS_WHERE,
new String[] { "" + groupID }, "data1 asc");
while (cursor.moveToNext()) {
// RAW_CONTACT_ID
long contactId = cursor.getLong(0);
list.add(contactId);
}
cursor.close();
return list;
}
//查询一个分组下联系人的详细信息.xupangpang
@SuppressWarnings("unused")
public List<ConnectEntry> queryLocalConnectGroupList(long groupID){
List<Long> contactIDS = getGroupContactIDs(groupID);
List<ConnectEntry> subList = new ArrayList<ConnectEntry>();
List<ConnectEntry> list=queryLocalConnectLists(false,null);
for (int i = 0; i < contactIDS.size(); i++) {
ConnectEntry connectEntry = new ConnectEntry();
for (int j = 0; j < list.size(); j++) {
if (contactIDS.get(i).equals(list.get(j).getContactid())){
connectEntry.setContactid(list.get(j).getContactid());
connectEntry.setGroupID(groupID);
connectEntry.setGroupName("");
connectEntry.setUserName(list.get(j).getUserName());
connectEntry.setTelePhoneNum(list.get(j).getTelePhoneNum());
subList.add(connectEntry);
}
}
}
return subList;
}做单位通讯录导入的时候,最先想到的就是读文件。没什么好说的,直接上代码。读取之后是建立数据库的,这样方便操作。文件类型为TXT,最先我想以后更新单位通讯录数据的时候,直接把TXT文件放到SD卡上把,日期一改就可以自动更新,但是客户说不用了,所以取消了。不过代码没删!

package cn.wangan.contact.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import cn.wangan.contact.dbhelp.ShowMyMainOperatorHelpor;
import cn.wangan.contact.entry.ConnectEntry;
public class ShowUnitsContactExportHelpor implements Serializable {
/**
* 读TXT文件
*/
private static final long serialVersionUID = 1L;
/**
* 创建其progressdialog 的进度条
*/
public void doCreateProgressDialog(Context context,SharedPreferences shared) {
String versionName = ""; // 版本号
final ProgressDialog dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("单位通讯录导入");
dialog.setIndeterminate(false);
dialog.setCancelable(false);
final List<String> groupList = new ArrayList<String>();
final List<ConnectEntry> connectList = new ArrayList<ConnectEntry>();
String groupName = "";
try {
InputStream inputStream = context.getAssets().open("vcf0001.txt");
if(inputStream == null){
ToastHelpor.shortToast(context, "为能找到相应的数据库文件更新");
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream, "gbk"));
String count = null;
while ((count = br.readLine()) != null) {
if (count.contains(":")) {
versionName = count.split(":")[1];
if(versionName.equals(shared.getString("VERSION_NAME", "135"))){
return;
}
} else if (count.contains(" ")) {
ConnectEntry entry = new ConnectEntry();
entry.setUserName(count.split(" ")[0]);
entry.setTelePhoneNum(count.split(" ")[1]);
entry.setGroupName(groupName);
connectList.add(entry);
} else {
groupName = count;
groupList.add(count);
}
count = null;
}
br.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 设置其相应的版本
final ShowMyMainOperatorHelpor helpor = new ShowMyMainOperatorHelpor(context);
shared.edit().putString("VERSION_NAME", versionName).commit();
final int values = connectList.size();
dialog.setMax(values);
dialog.show();
new Thread() {
@Override
public void run() {
helpor.insertUnitsDataGroup(groupList, connectList);
for (int i = 0; i < values; i++) {
helpor.insertUnitsDataEntry(connectList.get(i));
dialog.setProgress(i+1);
}
dialog.dismiss();
};
}.start();
}
}
package cn.wangan.contact.dbhelp;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
*创建数据库
*/
public class SqliteDBHelpor extends SQLiteOpenHelper {
public SqliteDBHelpor(Context context) {
super(context, "wa_contacts.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table wa_contacts(id integer primary key autoincrement," +
"userName varchar(50),telePhone varchar(100),groupID integer,groupName varchar(50)," +
"keySearch varchar(50), shortKeySearch varchar(10))";
db.execSQL(sql);
String sqlString = "create table wa_contacts_group(id integer primary key autoincrement," +
"groupName varchar(50),createTime varchar(20))";
db.execSQL(sqlString);
// String localSql = "create table wa_local_contacts(id integer primary key autoincrement," +
// "contactId long,telePhone varchar(100))";
// db.execSQL(localSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS wa_contacts");
db.execSQL("DROP TABLE IF EXISTS wa_contacts_group");
onCreate(db);
}
}
接下来就是对数据库进行操作了,这个就不说了,自己怎么建的数据库,就怎么操作!不懂的就大家交流一下...

来电显示人名,这个的最先听师兄说来电界面,都是系统在数据库里查询显示出来的。这个可以在来电界面数据库里面添加进去,然后来电画面就可以显示了。但是研究了很久都没进展。所以果断用覆盖图层的方式。。这个是我在网上找的,他是仿Iphone的界面来做全覆盖。我把它变成类似于360等软件的来电显示归属地那种了!

发帖字数限制。没办法全部贴出来。最后想要源码的就留邮箱咯!公司项目没办法呀!


...全文
相关推荐
tongxunlu.rar_通讯录
通讯录
iPhone通讯录批量整理方法
公司内部有员工小号,原本的编排规则发生了变动, 导致很多的来点无法识别归属。今天闲来无事,整理了一下自己的通讯录,想的应该挺简单,但实际操作起来,却遇到了不少麻烦。 整体思路: 1.导出现有通讯录 2.新员工小号进行匹配 3.更新手机通讯录 设备环境: iPhone + iOS 13.0 + Windows 操作步骤: ...
Android入门:增删改查通讯录
一、通讯录应用介绍 通讯录应用是Android自带的应用程序,我们看到此应用的时候,可能只认为这是一个应用,用数据库存储数据,但是实际上不是这样的。 通讯录是ContentProvider的应用,通讯录由两部分组成: (1)com.android.providers.contacts的ContentProvider:真正存储数据的ContentProvider (2)com.and
c语言源文件\通讯录(c语言版)
C语言编写通信录 有添加、删除、排序、插入、查找功能
C语言课程设计 通讯录管理系统
C语言课程设计 通讯录管理系统 全代码


