Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android批量添加聯系人

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 lists;
	//保存去除掉某些用戶後的聯系人數據
	private List records;
	//用來顯示excel中聯系人和聯系電話的控件
	private ListView listView;
	//將數據映射到listView的適配器
	private SimpleAdapter adapter;
	//映射到控件中的數據
	private List> 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 xlsFiles = new HashMap();  
	            // 下面幾句設置各文件類型的圖標, 需要你先把圖標添加到資源文件夾  
	            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>();
		Iterator iter=lists.iterator();
		while(iter.hasNext()){
			PhoneRecord record=iter.next();
			Map map=new HashMap();
			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 hash=(HashMap) 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 readExcel(){
		List lists=new ArrayList();
		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 list){
		ArrayList ops = new ArrayList();
		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();
		int i=0;
		for (; i < size; i++) {
			PhoneRecord record=new PhoneRecord();
			Map 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();
         }
	}
	
}

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved