文档章节

联系人助手 3.功能的实现

c
 chuiyuan
发布于 2014/04/27 22:43
字数 1357
阅读 91
收藏 0
点赞 0
评论 1

  一. 分析 : java文件以及要实现的功能 

1 .主界面------MainActivity.java

  各个功能的跳转 

MainActivity  --------->ExportExcel.java (导出联系人)

                   ---------->ImportExcel.java (导入联系人)

两个分支里面都 有文件浏览功能 

                ------------>FileSerach.java (文件浏览)

2. 导出联系人界面 --------ExportExcel.java

功能有:

 (1) 通过  ContentProvider 查询所有的联系人数据到  Cursor中。

(2) 将Cursor中的数据遍历并保存在  Map中,因为Cursor存在 的时间很短,我们无法保证 在很短的时间内完成所有 数据 的写入工作。

(3)遍历Map数据 并写入到Excel中。

3.  导入联系人 -----------ImportExcel.java

功能与导出相仿,主要 工作:

遍历Excel文件,将数据逐一写入到联系人数据库中。  

4. 实现 文件的浏览功能模块---------FileSerach.java

    用于浏览手机中所有 的文件,以方便用户选择要导入 or导出的路径。 


二、先重点实现导出联系人界面的所功能 

  1. 整体设计 

initView() --------------->initXLs()   ---------------> add()

public class ExportExcel extends Activity{
	public String FILE_PATH ="";
	public String FILE_NAME="";
	public static final String END_TAG="导出完毕,可以退出程序";
	WritableWorkbook wwb ;
	WritableSheet ws;
	ContentResolver resolver ;
	TextView tv;
	TextView tips ;
	EditText fileNameEdit;
	EditText filePathEdit;
	Button searchBtn;
	Button exportBtn;
	ProgressBar bar;
	Handler handler ;   //Handler用于处理消息,改变 UI
	HashMap <String ,String >map = new HashMap<String ,String >();//保存联系人信息
	HashMap<String ,String >new_map= new HashMap<String ,String >();
	//保存已经导出的联系人数据

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.export);
		initView();
		
		handler = new Handler (){
			public void handleMessage(Message msg) {
				String content =(String) msg.obj;
				int added= msg.arg1;
				tv.setText(content);                       //显示正在导出的人名
				bar.setProgress(added);                //进度
				if(content.equals(END_TAG)){
					bar.setVisibility(View.INVISIBLE);
					tips.setVisibility(View.INVISIBLE);
					tv.append("\n本次导出记录 :"+String.valueOf(added)+"条");
					
				}
				super.handleMessage(msg);
			}
			
		};
	}

	private void initView() {
		// TODO Auto-generated method stub
		
	}

}

     在安卓 中,所有界面的更新都要在主线程中,如果我们希望在不同的线程中更新UI,可以使用Handler ,在安卓 中,Handler常常用来接收其它线程发送的消息,并适时进行界面的更新。

    Handler是一个用于线程间通信的类,最常用于做下载条,

    我们重写  handleMessage方法,并在这个 方法中进行界面的更新,在其它的线程中使用 

Handler.sendMessage ()

方法就可以触发这个 回调方法。


2. initView的实现 

private void initView() {
		// TODO Auto-generated method stub
		tv = (TextView)findViewById(R.id.tv);
		tips=(TextView)findViewById(R.id.tips);
		fileNameEdit=(EditText)findViewById(R.id.fileNameEdit);
		filePathEdit=(EditText)findViewById(R.id.filePathEdit);
		searchBtn =(Button)findViewById(R.id.search);
		exportBtn =(Button)findViewById(R.id.exportBtn);
		bar =(ProgressBar )findViewById(R.id.bar);
		
		tips.setVisibility(View.INVISIBLE);   //先不可见
		bar.setVisibility(View.INVISIBLE);
		tv.setVisibility(View.INVISIBLE);
		
		searchBtn.setOnClickListener(new OnClickListener(){
			public void onClick(View arg0) {
				Intent i = new Intent (getBaseContext() , FileSearch.class);
				startActivityForResult(i ,0);  //requestCode
			}
		});
		
		exportBtn.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				map.clear();
				new_map.clear();
				FILE_NAME=fileNameEdit.getText().toString();  //得到文件名
				FILE_PATH=filePathEdit.getText().toString();  //文件路径 
				if (initXLs()){                   //初始化jxl,使之可用,如果成功,则开始添加 
					bar.setMax(map.size());  //这是 用map,而不是new_map
					tips.setVisibility(View.VISIBLE);
					bar.setVisibility(View.VISIBLE);
					tv.setVisibility(View.VISIBLE);
					Thread th = new Thread(new Runnable(){
						public void run() {
							// TODO Auto-generated method stub
							add();    //使用单独的线程完成 将联系人添加 到excel的工作
						}
					});
					th.start();
				}
			}
		});
	}

3. initXLs的实现 

    功能 :实现 了可写 的workbook和sheet的创建 ,同时 完成 了数据 源了组成 ,也就是将联系人列表读入HashMap中。

private boolean initXLs() {
		// TODO Auto-generated method stub
		if(FILE_PATH.trim().equals("")){
			FILE_PATH= Environment.getExternalStorageDirectory().getAbsolutePath();
		}
		if (!FILE_NAME.endsWith(".xls")&&!FILE_NAME.contains(".")){
			FILE_NAME=FILE_NAME+".xls";
		}
		String path = FILE_PATH+"/"+FILE_NAME.trim();
		try{
			File file = new File(path);
			if(!file.exists()){
				file.createNewFile();
			}
			wwb=Workbook.createWorkbook(file);
			ws = wwb.createSheet("联系人列表",0);
			//得到ContentResolver对象 
			resolver=getContentResolver();
			Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
					null, null, null, null);
			cursor.moveToFirst();
			while (!cursor.isAfterLast()){
				String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); //得到姓名
				String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
				map.put(name, number);
				cursor.moveToNext();
			}
			return true;
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e1){
			Toast.makeText(getBaseContext(), "文件路径错误", Toast.LENGTH_SHORT).show();
			e1.printStackTrace();
		}
		return false;
	}

注意,里面用到了IO相关的类,要给一定的权限 ,要不然会出现 IOException.

  <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"/>

如果在Workbook创建 时,出现 了找不到Class的错误 ,应该是jxl 库导入的问题,可以直接复制 到libs文件下。

注意里面的联系人信息的取得 :

联系人列表 URI:   

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

联系人姓名:

ContactsContract.Contacts.DISPLAY_NAME

联系人电话:

ContactsContract.CommonDataKinds.Phone.NUMBER


4. add的实现 

由于 add()方法执行在不同的线程中,所以我们不能直接 在这个 线程中进行UI的修改,这就要用来 我们讲到的 

Handler.sendMessage()方法。

private void add() {
		// TODO Auto-generated method stub
		try {
			Iterator <Entry<String ,String >>iter = map.entrySet().iterator();
			Label labelC0= new Label (0 ,0 ,"name");
			Label labelC1 = new Label (1,0,"number");
			ws.addCell(labelC0);
			ws.addCell(labelC1);
			int row =1;
			while (iter!=null&&iter.hasNext()){     //遍历Map
				Entry <String ,String >entry = iter.next();
				String name = entry.getKey();
				String number =entry.getValue();
				//判断 是否有重复的
				if(map_new.containsKey(number)){
					continue;
				}else {
					map_new.put(number, "");
				}
				//将姓名 和号码写入到单元 格并加入 到表中,同时 能和 handler此时 正在 导出的内容 
				if(name!=""&&number!=""){
					Label labelName = new Label (0,row, name);
					Label labelNumber = new Label (1,row ,number );
					ws.addCell(labelName);
					ws.addCell(labelNumber);
					Message msg = new Message ();
					msg.obj= name+":"+number ;
					msg.arg1= row;
					handler.sendMessage(msg);  //消息发送到handler 中
					row++;
					
				}
			}
			wwb.write();  //写入到wwb中
			wwb.close();
			
			Message msg = new Message ();   //发送结束标志
			msg.obj=END_TAG;
			msg.arg1=row-1;
			handler.sendMessage(msg);
		}catch(Exception e ){
			e.printStackTrace();
		}
	}

为了加入延时的效果,我们在row++代码 后面加入 线程延时600ms

try {
	                    Thread.currentThread().sleep(600);
	                } catch (InterruptedException e) {
	                    e.printStackTrace();
	                }

5. 实现 onActivityResult()方法

由于在整体设计 中,我们用到了startActivityForResult (),所以有这个。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		switch(resultCode){
			case RESULT_OK:
				Bundle bundle = data.getExtras();
				String filePath = bundle.getString("filePath");
				filePathEdit.setText(filePath);
				break;
			default :
					break;
		}
	}


© 著作权归作者所有

共有 人打赏支持
c
粉丝 9
博文 91
码字总数 40993
作品 0
海淀
加载中

评论(1)

c
chuiyuan
将联系人信息导出为CSV和VCF格式文件

  上篇文章中,我们介绍了如何从csv和vcf格式的文件中获取联系人信息。链接:http://blog.csdn.net/github_36878269/article/details/76696685 这次我们反着来,将联系人信息导出为这两种格...

github_36878269 ⋅ 2017/08/05 ⋅ 0

曝谷歌正为安卓 8.0 系统打造全新智能特性

据外媒(VentureBeat)报道,谷歌正在为其 Android 移动操作系统开发新的辅助功能。 这些功能可能并不会在下一个 Android 系统版本中亮相。谷歌预期在今年 5 月份的 I/O 大会上发布 Android ...

局长 ⋅ 2017/03/08 ⋅ 10

中国移动灵犀云语音识别SDK(android)使用介绍

随着智能家居概念的火热,语音交互这一新时代的人机交互方式再度掀起了热潮。移动互联网应用在设计开发时也纷纷考虑加入语音识别功能,带给用户除传统键盘或触控交互方式外的更便捷交互体验。...

iherro ⋅ 2015/02/02 ⋅ 4

语音助手的安卓客户端设计

一、开发环境配置 本论文选用科大讯飞开发平台提供的语音合成和语音识别技术,完成语音助手软件的开发,最终在安卓手机上正常运行。在win10完成,使用android studio开发编译,软件测试机器为...

yueqian_scut ⋅ 2017/08/20 ⋅ 0

微信公众号获取精准粉丝方法?

     微信公众号获取精准粉丝方法?应该可以说粉丝就是公众号的生命,最近很多微信用户问我微信公众号获取精准粉丝方法?下面小编就带你了解一下微信公众号获取精准粉丝方法?      微信...

公众开发运营官网 ⋅ 02/28 ⋅ 0

如何查别人的微信聊天记录?

很多人都会用微信相互用语音聊情话,那么查看并保存微信的信息记录呢?小猪研究了好几天,在这里把方法分享给大家,希望对同样有这方面想法的大家有帮助。 使用智能手机的朋友基本都知道微信...

小品文 ⋅ 2014/06/22 ⋅ 0

使用组策略统一管理OC

相比LCS的组策略,OCS增加了很多功能。做为IT人员管理和实施人员统一部署的好助手,它的一些功能非常有用,比如保存用户密码、设置通讯薄URL和限制用户添加数量等,有效的扩展和补充了了OCS...

余二五 ⋅ 2017/11/01 ⋅ 0

智能音箱Echo秘密记录谈话 亚马逊:Alexa误判了指令

据西雅图当地媒体KIRO7称,亚马逊旗下智能音箱产品Echo可能会秘密记录你的谈话内容,某些情况下,还可能将其发送给其他人。这种事情就发生在了位于美国俄勒冈州波特兰市的一个家庭中,放置在...

新浪科技 ⋅ 05/25 ⋅ 0

新型病毒伪装成“Facebook” 专盗隐私

  【IT168 评论】近期,瑞星“云安全”系统拦截到一款新型Android病毒,该病毒伪装成知名社交网站“Facebook”的应用程序引诱网民下载安装,手机一旦中毒就会按照黑客指定命令发送短信或拨...

it168网站 ⋅ 2014/08/08 ⋅ 0

数据结构——链表实现通讯录

本文通过上文实现的链表,实现一个简单的通信录 通讯录功能: 1、添加联系人 2、查找联系人 3、删除联系人 4、显示所有联系人 (1)定义联系人信息结构 (2)显示联系人模块 (3)添加联系人...

翼动动空 ⋅ 2016/06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 59分钟前 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部