1. 程式人生 > >android批量新增聯絡人工具

android批量新增聯絡人工具

研究生期間就沒寫過Java程式碼了,這幾天由於想做一個統計網頁詞頻的工具,但是使用C++不是很方便,於是又用Java做了一個小工具。翻開電腦中以前的檔案,發現之前還做過一個android中批量新增聯絡人的工具,瞬間感覺好親切,也感嘆時間過得好快,一眨眼研究生就快要過完了。

記得當初做這個批量新增聯絡人的工具是剛來讀研時,一大堆新同學的手機號碼需要新增,班長整理出來同學們的通訊錄後就得一個一個輸入聯絡人和號碼到手機中,想想這罪可有的受,於是就想能不能讓手機直接讀取xls格式(Excel格式)的檔案到通訊錄中,在網上查了下發現一般管理類的軟體都沒有這個小工具,想想可能是由於這個工具對excel檔案的格式有限制吧。於是想幹脆自己做一個算了,這個邏輯也不是很複雜,那個時候還懂一點android開發的東西。而且這個東西對android中的特性也不是很高,所以就做了一個批量新增聯絡人的小工具。現在兩年沒碰java,好多java的api和特性都忘記了,前兩天做哪個網頁詞頻統計的工具都是跌跌撞撞寫出來的,android的東西就忘的幾乎差不多了,只記得實現這個工具的大致思路。

一時玩心大起,便想看看當初做的這個東西。可惜電腦換系統了以前android開發的sdk也沒了,不過好歹軟體的apk檔案還在,於是就借了同學的三星的手機將它安裝到手機上,發現還能正常執行!!!簡直太欣慰了,說明當初編寫的程式碼魯棒性還是蠻不錯的,而且程式碼中註釋也不少,現在看了下程式碼也能明白大概的思路,要是再花點時間看看Android開發的api可能就很快能上手了。於是在這裡整理下。個人覺得這個東西實用性還是蠻強的,雖然沒多少技術含量^ ^。

下面是實現這個工具的基本結構:


實現往通訊錄中新增聯絡人需要上面基本的三個步驟,但是由於最開始就是為自己和班級同學製作的,所有預設顯示的就是我們班同學的通訊錄,軟體執行的初始化介面如下:


軟體開始執行後會有個提示框,提示軟體的操作方法,點選確定後就可以操作,最上面有兩個按鈕,一個“一鍵新增”和“選擇檔案新增”按鈕,下面每一行代表一個聯絡人的資訊,從左到右依次是聯絡人姓名,電話號碼,以及是否選擇(是否選擇新增到通訊錄中,預設是全部選擇)。

將不需要新增的聯絡人的右邊的多選框中的勾去掉,然後點選“一鍵新增”按鈕,就可以將選中的聯絡人全部倒入通訊錄中。

如果要新增自己的通訊錄,可以將通訊錄存在的excel檔案中(excel檔案中第一列為聯絡人姓名,第二列為電話號碼),然後點選上面的“選中檔案新增”按鈕,此時會彈出檔案選擇對話方塊,選中需要新增的通訊錄對應的xls檔案,此時下面的列表中就會顯示你選中的通訊錄中的聯絡人和號碼,然後點選“新增”就可以將選中的聯絡人新增到通訊錄中了。


上面就是程式的基本設計思路,具體的實現程式碼如下,我現在也只能根據註釋看出那些函式式是什麼的,以及程式的邏輯結構是怎麼組織的,至於程式設計的細節都忘得長不多了。

真是囧啊。

存放聯絡人資訊的類:

package com.example.bean;

public class PhoneRecord {
	private int id;
	private String name;
	private String number;
	private boolean isChecked;
	
	
	public PhoneRecord() {
		super();
	}
	
	
	public PhoneRecord(String name, String number) {
		super();
		this.name = name;
		this.number = number;
	}


	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}


	public boolean isChecked() {
		return isChecked;
	}


	public void setChecked(boolean isChecked) {
		this.isChecked = isChecked;
	}
	
	
}

主要的Activity,程式的處理邏輯都在這個類裡面。裡面同時有一些按鈕的響應程式碼。
package com.example.activity;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import jxl.Sheet;
import jxl.Workbook;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentProviderOperation;
import android.content.OperationApplicationException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.bean.PhoneRecord;
import com.example.contract.R;

/**
 * 
 * @author xiaxiongfeng
 * @date 2013/9/1
 * @version 1.0
 */

public class MainActivity extends Activity {
	
	//儲存從excel檔案中讀取進來的資料
	private List<PhoneRecord> lists;
	//儲存去除掉某些使用者後的聯絡人資料
	private List<PhoneRecord> records;
	//用來顯示excel中聯絡人和聯絡電話的控制元件
	private ListView listView;
	//將資料對映到listView的介面卡
	private SimpleAdapter adapter;
	//對映到控制元件中的資料
	private List<Map<String, Object>> maps;
	//當用戶點選“選擇新增檔案”按鈕後彈出的對話方塊
	private ProgressDialog mpDialog;
	//儲存選擇的xls檔案的路徑
	private String filepath;
	//對話方塊的標示
	static private int openfileDialogId = 0;

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView=(ListView) findViewById(R.id.list);
		lists=readExcel();
		mapViewList();
		enterDialog();
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	@Override
	@Deprecated
	protected Dialog onCreateDialog(int id) {
		// TODO Auto-generated method stub
		 if(id==openfileDialogId){  
	            Map<String, Integer> xlsFiles = new HashMap<String, Integer>();  
	            // 下面幾句設定各檔案型別的圖示, 需要你先把圖示新增到資原始檔夾  
	            xlsFiles.put(OpenFileDialog.sRoot, R.drawable.filedialog_root);   // 根目錄圖示  
	            xlsFiles.put(OpenFileDialog.sParent, R.drawable.filedialog_folder_up);    //返回上一層的圖示  
	            xlsFiles.put(OpenFileDialog.sFolder, R.drawable.filedialog_folder);   //資料夾圖示  
	            xlsFiles.put("xls", R.drawable.filedialog_wavfile);   //wav檔案圖示  
	            xlsFiles.put(OpenFileDialog.sEmpty, R.drawable.filedialog_root);  
	            Dialog dialog = OpenFileDialog.createDialog(id, this, "注意只能選擇xls格式的檔案", new CallbackBundle() {  
	                @Override  
	                public void callback(Bundle bundle) {  
	                	//選擇檔案後會進入這個函式,首先將檔案路徑儲存在全域性變數中
	                    filepath = bundle.getString("path");  
//	                    setTitle(filepath); // 把檔案路徑顯示在標題上  
	                    //讀取excel檔案,此時由於filepath不為空,readExcel會從filepath指定的路徑中讀取資料而不會使用預設的資料
	                    lists=readExcel();
	                    //將讀取到的資料使用介面卡對映到ListView控制元件中
	            		mapViewList();
	            		//將“一鍵新增”按鈕隱藏
	            		((Button)findViewById(R.id.defaultBtnID)).setVisibility(View.INVISIBLE);
	            		//將“新增”按鈕顯示
	            		((Button)findViewById(R.id.realAddBtn)).setVisibility(View.VISIBLE);
	            		//讓“選擇檔案新增”按鈕失去焦點
	            		((Button)findViewById(R.id.otherBtnID)).setFocusable(false);
	                }  
	            },   
	            ".xls;",  
	            xlsFiles);  
	            return dialog;  
	        }  
	        return null;  
	}
	
	/**
	 * 將從excel中讀取到的資料轉化到map中,然後將其顯示到控制元件中
	 */
	public void mapViewList(){
		maps=new ArrayList<Map<String,Object>>();
		Iterator<PhoneRecord> iter=lists.iterator();
		while(iter.hasNext()){
			PhoneRecord record=iter.next();
			Map<String,Object> map=new HashMap<String, Object>();
			map.put("name", record.getName());
			map.put("number", record.getNumber());
			map.put("isChecked", record.isChecked());
			maps.add(map);
		}
		adapter=new SimpleAdapter(this, maps, R.layout.activity_main_item, 
				new String[]{"name","number"}, new int[]{R.id.name,R.id.number}){
		
			@Override
			public View getView(int position, View convertView,
					ViewGroup parent) {
				// TODO Auto-generated method stub
				View view=super.getView(position, convertView, parent);
				final HashMap<String,Object> hash=(HashMap<String, Object>) this.getItem(position);
				
				CheckBox cb=(CheckBox) view.findViewById(R.id.checked);
				cb.setChecked((Boolean) hash.get("isChecked"));
				
				cb.setOnClickListener(new View.OnClickListener() {
					
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						hash.put("isChecked", ((CheckBox)v).isChecked());
						
					}
				});
				return view;
			}
			
		};
		listView.setAdapter(adapter);
	}
	
	//從excel中讀取資料儲存到PhoneRecord類中
	public List<PhoneRecord> readExcel(){
		List<PhoneRecord> lists=new ArrayList<PhoneRecord>();
		try {
//            InputStream is = new FileInputStream("mnt/sdcard/test.xls");  
            InputStream is=getAssets().open("contact.xls");
            //只有彈出選擇檔案對話方塊並且選擇了檔案後才會進入這個選擇分支,否則預設新增的是系統自帶的通訊錄
            if (filepath!=null) {
				is=new FileInputStream(filepath);
			}
			Workbook book = Workbook.getWorkbook(is);  
            book.getNumberOfSheets();  
            // 獲得第一個工作表物件  
            Sheet sheet = book.getSheet(0);  
            int Rows = sheet.getRows();  
           for (int i = 0; i < Rows; i++) {
        	   PhoneRecord record=new PhoneRecord();
        	   String name=sheet.getCell(0,i).getContents();
        	   String number=sheet.getCell(1,i).getContents();
        	   if (name==null||name.equals("")||number==null||number.equals("")) {
        		   continue;
        	   }
        	   record.setName(name);
        	   record.setNumber(number);
        	   record.setChecked(true);
        	   lists.add(record);
			}
           
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return lists;
	}
	
	
	/**
	 * 將資料儲存到通訊錄中的方法
	 * @param list
	 */
	public  void CopyPhoneRecords(List<PhoneRecord> list){
		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
		int rawContactInsertIndex;
		if (list==null||list.size()==0) {
			return ;
		}
		for (int i = 0; i < list.size(); i++) {	
		     	rawContactInsertIndex = ops.size();
		 
		    	ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
		                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
		                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
		                    .withYieldAllowed(true)
		                    .build());
		      	ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
		                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,
						rawContactInsertIndex)
		                    .withValue(ContactsContract.Data.MIMETYPE,
		                            	ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
		                    .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,list.get(i).getName())
		                    .withYieldAllowed(true)
		                    .build());
		     	ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
		                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
		                    .withValue(ContactsContract.Data.MIMETYPE,
		                            	ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
		                    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, list.get(i).getNumber())
		                    .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_MOBILE)
		                    .withYieldAllowed(true)
		                    .build());
		 
				} 
		     	try {
				//這裡才呼叫的批量新增
		        	this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
		        	
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (OperationApplicationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		 
			}	
	
	//這個handler只有一個作用,接受到訊息後關閉提示進度框
	Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			mpDialog.dismiss();
		};
	};
	
	Handler toastHandler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				Toast.makeText(getApplicationContext(), "批量新增完成!", Toast.LENGTH_LONG).show();
				break;
			case 2:
				Toast.makeText(getApplicationContext(), "請選擇聯絡人!", Toast.LENGTH_LONG).show();
				break;
			default:
				break;
			}
		};
	};
	
	/**
	 * "一鍵新增"按鈕的響應事件
	 * @param view
	 */
	public void defaultAdds(View view){
		//預設的新增通訊錄得事件
		adds();
	}
	
	/**
	 * "選擇檔案新增"按鈕的響應事件
	 * @param view
	 */
	public void otherAdds(View view){
//		  showDialog(openfileDialogId);
		//當點選了“選擇檔案新增”後將“一鍵新增”按鈕設為不可獲得焦點
//		Button bt=(Button)findViewById(R.id.defaultBtnID);
//		bt.setFocusable(false);
		//彈出檔案選擇對話方塊
		showDialog(openfileDialogId);
		
		
	}
	
	/**
	 * "新增"按鈕的響應事件
	 * @param view
	 */
	public void realAdd(View view){
		//新增資料
		adds();
		//將“一鍵新增”按鈕隱藏
		((Button)findViewById(R.id.defaultBtnID)).setVisibility(View.INVISIBLE);
		//將“選擇檔案新增按鈕”可以獲得焦點
		((Button)findViewById(R.id.otherBtnID)).setFocusable(true);
		
	}
	
	/**
	 * 真實的新增過程
	 * 首先需要遍歷從excel中讀取的資料,判斷他們的isChecked屬性是否為真
	 * 預設情況下是為真,但是如果使用者點選了ListView中的複選框,將某個使用者去除的話這個屬性會為假
	 */
	public void adds(){
	
		int size=maps.size();
		records=new ArrayList<PhoneRecord>();
		int i=0;
		for (; i < size; i++) {
			PhoneRecord record=new PhoneRecord();
			Map<String,Object> tmp=maps.get(i);
			record.setName((String) tmp.get("name"));
			record.setNumber((String) tmp.get("number"));
			if((Boolean) tmp.get("isChecked")){
				records.add(record);
			}
			
		}
		
		//彈出提示進度框
		mpDialog=ProgressDialog.show(this, "提示", "新增通訊錄中,請等待...");
		
		//開啟一個新執行緒
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Message msg=new Message();
				//在新的執行緒執行新增操作
				if (records!=null&&records.size()!=0) {
					CopyPhoneRecords(records);
					//彈出一句話,提示批量操作完成
					msg.what=1;
					toastHandler.sendMessage(msg);
					//當新增操作完成後,給提示進度框傳送一個訊息,讓進度框關閉
					handler.sendEmptyMessage(0);
					
					
				}else{
					msg.what=2;
					toastHandler.sendMessage(msg);
					handler.sendEmptyMessage(0);
					
				}
				
			}
		}).start();
		
	}
	
	
	//最開始啟動時的提示介面
	public void enterDialog(){
		final Dialog dialog=new Dialog(this,R.style.popupDialog);
		dialog.setContentView(R.layout.verify_dialog);
		dialog.setCancelable(false);
		TextView message=(TextView) dialog.getWindow().findViewById(R.id.messageTxt);
		message.setText(this.getString(R.string.defaultTxt));
		Button okBtn=(Button) dialog.getWindow().findViewById(R.id.messageBtn);
		 okBtn.setOnClickListener(new OnClickListener() {
             
             @Override
             public void onClick(View v) {
                 if(dialog!=null && dialog.isShowing())
                 {
                     dialog.dismiss();
                 }
             }
         });
         if(dialog!=null && !dialog.isShowing())
         {
             dialog.show();
         }
	}
	
}

整個工程的原始碼下載

相關推薦

android批量新增聯絡人工具

研究生期間就沒寫過Java程式碼了,這幾天由於想做一個統計網頁詞頻的工具,但是使用C++不是很方便,於是又用Java做了一個小工具。翻開電腦中以前的檔案,發現之前還做過一個android中批量新增聯絡人的工具,瞬間感覺好親切,也感嘆時間過得好快,一眨眼研究生就快要過完了。

Lync 批量新增聯絡人

在OCS 2007 的資源工具包裡面有一個小工具叫LCSAddContacts,這個WSF指令碼允許你使用WMI為LCS或者OCS新增使用者(Lync Server不行)。我希望見到這個工具的LYNC版本,但是沒有那麼好運,所以我決定自己寫一個。 我吃驚的發現沒有PowerShell命令來新增聯絡人組或者聯

Android 批量插入聯絡人 分享

大體的問題是這樣的: class VCardEntry{   String name;   String[] number;      getDisplayName();      getPhoneList()   class phone {         getNum

訪問通訊錄中的聯絡人和批量新增聯絡人

一、訪問通訊錄中的聯絡人(根據號碼查詢聯絡人)     主要用到資料庫(data\data\com.android.providers.contacts)中三張表,raw_contact、data、mimetypes.從第一張表獲取_id,根據_id從data表中查詢聯絡人

MSN批量新增聯絡人

MSN的聯絡人匯出格式為字尾為.ctt,是xml。建立一個符合該xml檔案格式的檔案,即可新增聯絡人。美中不足的是無法新增暱稱。有時間試試rubymsn。。<?xml version="1.0"?><m

Android-讀取/新增/作業系統聯絡人資料

想要訪問Android作業系統的ContentProvider就需要明白以下原理:   在Android作業系統裡面的 /packsges/目錄:   apps: 很多的系統應用,例如:聯絡人,瀏覽器,音樂播放器,設定,相機 ......                           

Android 開發即時聊天工具 YQ :(八) 新增/刪除好友

國際慣例,先上圖: 程式碼比較簡單,只需給listview設定Listener就OK, 當點選刪除後,這裡沒有做提示,會直接刪除,刪除後應當給伺服器傳送一個刪除好友的包,伺服器端更新資料庫中的資料。 然後客戶端要做的就是更新下好友列表。 具體看程式碼吧: private

android studio DDMS新增工具

本文中 Android Studio 的版本為 Android Studio 2.2 ,作業系統為 Windows,如有操作不同,可能是版本差異。 在工具欄中新增一些常用的圖示有利於我們開發,舉例說明: Android Studio 2.2 版本的選單欄和工具欄

Android通訊錄模糊查詢搜尋(號碼,姓名,首字母簡拼,全拼),批量選取聯絡人

package com.xbc.utils.activity; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import android.

Android基礎:獲取手機聯絡人工具

Bean: public class ContactInfo { public String id; public String name; public String phone; } Co

Android 使用版本控制工具新增忽略檔案方式

一、使用SVN管理專案時,新增忽略檔案的方式 Android Studio 配合SVN時,新增忽略檔案相對簡單,首先開啟專案的Settings選項,切換到Version Control下的Ignored Files目錄,如下圖: ignore1.png 點選右上角綠色加號,出現如下對話方塊:

Android新增聯絡人資訊並讀取

package com.example.cxy.androidcontact; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import

如何向android手機通訊錄中新增聯絡人

直接在手機的通訊錄的資料庫中新增列表 相關程式碼如下 package com.example.test; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import

批量新增Exchange郵件聯絡人

公司的一個sales那天給100多個客戶傳送郵件,需要手動新增一個個聯絡人到一個組 那樣比較費力,加入哪天手上客戶數量有1000個呢? 於是老大提醒我說,去Exchange上面把這些客戶名單批量匯入到聯絡人。 上面說的是在Exchange命令列中使用csvde??然後再

windows遠端連線工具批量新增tsmmc主機

'/*========================================================================= ' * Intro       解決win2003遠端桌面連線多臺伺服器時,重做系統後還得一個一個得加半天。效率非常低的

android手機原始碼聯絡人頁面新增緊急電話模組

根據讀原始碼可知,所有顯示聯絡人頁面是在DefaultContactBrowseListFragment類,在其類中我們可一發現 private void addEmptyUserProfileHeader(Layou

Android訪問通訊錄和新增聯絡人

package com.example.test; import java.util.ArrayList; import android.content.ContentProviderOperation;

Pro Android學習筆記(一六四):聯絡人API(7):新增聯絡人

新增新的聯絡人,就要增添raw contacts,需要android.permission.WRITE_CONTACTS的許可權。下面是程式碼片段: //新增聯絡人的程式碼片段,入口為addContactTest()。showInfo()為在activity框中顯示資訊

Android開發中有用工具之--Log工具

util lena 日誌 日誌信息 stat 們的 常常 我們 imp 在開發的過程中。我們常常會使用Log來輸出日誌,幫助我們來調試程序 可是有時候並不能全然滿足我們的須要 ,比方我想知道這個日誌信息是來自於哪一個包 哪一個類 所以我們封裝一個這個Log類。方便我們的

Android經常使用的工具

json格式 執行 hub 公共類 des red 變量 nds 讀寫 主要介紹總結的Android開發中經常使用的工具類,大部分相同適用於Java。 眼下包含HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、