文档章节

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

c
 chuiyuan
发布于 2014/04/27 22:43
字数 1357
阅读 93
收藏 0

  一. 分析 : 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
博文 92
码字总数 40993
作品 0
海淀
私信 提问
加载中

评论(1)

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

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

github_36878269
2017/08/05
0
0
微信公众号获取精准粉丝方法?

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

公众开发运营官网
02/28
0
0
语音助手的安卓客户端设计

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

yueqian_scut
2017/08/20
0
0
中国移动灵犀云语音识别SDK(android)使用介绍

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

iherro
2015/02/02
2.5K
4
曝谷歌正为安卓 8.0 系统打造全新智能特性

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

局长
2017/03/08
3.2K
10

没有更多内容

加载失败,请刷新页面

加载更多

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

摘要: 有一个业务是查询最新审核的5条数据 ```sql SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `status` = 'ONLINE' ORDER BY `audit_time` D. 原来链接 ......

阿里云官方博客
14分钟前
1
0
详解如何用爬虫采集视频播放量数据(以腾讯视频为例)

现代社会提到大数据大家都知道这是近几年才形成的对于数据相关的新名词,在1980年,著名未来学家阿尔文·托夫勒便在 《第三次浪潮》一书中,将大数据热情地赞颂为“第三次浪潮的 华彩乐章”...

技术阿飞
20分钟前
1
0
区块链时代的拜占庭容错:Tendermint(二)

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》 原文作者:Ethan Buchman 翻译:饶云坤 校对:傅晓波 本文为节选 以下为正文: 本章阐述Tendermint共识算法...

万向区块链
33分钟前
0
0
AS连接网易Mumu模拟器

1、安装模拟器 打开这个网址现在模拟器然后安装 http://mumu.163.com/ 2、安装完成后启动模拟器 3、进入模拟器安装目录 例如本机的安装目录:C:\Program Files (x86)\MuMu\emulator\nemu\vmo...

HGMrWang
39分钟前
9
0
设计要做到扩展性强还挺难的

概述 在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是: 你不熟悉这个行业的业务的玩法 我举个例子来...

Sam哥哥聊技术
41分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部