Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之——常用手機號碼功能

Android之——常用手機號碼功能

編輯:關於Android編程

 

有些Android手機中會帶有一些常用號碼的功能,比如訂餐電話、公共電話、航空機票,等等諸如此類的服務,點擊相應的號碼會自動彈出撥打電話的界面。那下面我們就一起來實現一個手機常用號碼功能的小例子吧。

一、原理

首先,這些常用號碼放置在一個SQLite數據庫中,我們將這些號碼從數據庫中讀取出來,按照相應的順序顯示到Android系統提供的ExpandableListView中(有關ExpandableListView的詳細用法請大家參考Android官方文檔,我在這裡就不多說了),然後給每個條目設置點擊事件,在點擊事件中激活撥打電話的界面,並將相應的號碼傳遞到撥打電話的界面。

好了,原理講完了,是不是很簡單呢?下面,我們就一起來實現這些具體的功能吧。

二、實現

1、准備數據庫

我們首先將數據庫放置在Android項目下的assets目錄

如下圖:

\

2、創建數據的操作類CommonNumberService

新建數據操作類CommonNumberService,這個類中主要有4個方法,一個是構造方法,在構造方法中我們將Android上下文對象傳遞到這個類中,其他3個方法實現了將數據庫拷貝到/data/data/應用包名/files目錄,然後實現數據的查詢操作。

1)構造方法的實現

在構造方法中,我們將上下文對象傳遞到這個類中

具體實現代碼如下:

 

private Context context;
	
public CommonNumberService(Context context) {
	super();
	this.context = context;
}

 

2)獲取常用號碼組數據方法

具體代碼如下:

 

/**
 * 得到組數據
 * @return
 */
public List> getGroupData(){
	List> groupData = new ArrayList>();
	File file = new File(context.getFilesDir(), commonnum.db);
	SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
	if(db.isOpen()){
		Cursor c = db.query(classlist, new String[]{name, idx}, null, null, null, null, null);
		while(c.moveToNext()){
			Map map = new HashMap();
			String name = c.getString(c.getColumnIndex(name));
			String idx = c.getString(c.getColumnIndex(idx));
			map.put(name, name);
			map.put(idx, idx);
			groupData.add(map);
		}
		c.close();
		db.close();
	}
	return groupData;
} 

 

3)獲取常用號碼子條目數據

具體代碼如下:

 

/**
 * 得到子條目的數據
 * @return
 */
public List>> getChildData(){
	List>> childData = new ArrayList>>();
	List> groupData =  this.getGroupData();
	File file = new File(context.getFilesDir(), commonnum.db);
	SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
	if(db.isOpen()){
		for(int i = 0; i < groupData.size(); i++){
			String idx = groupData.get(i).get(idx);
			List> list = new ArrayList>();
			Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null);
			while(c.moveToNext()){
				Map map = new HashMap();
				String name = c.getString(c.getColumnIndex(name));
				String number = c.getString(c.getColumnIndex(number));
				map.put(name, name);
				map.put(number, number);
				list.add(map);
			}
			c.close();
			childData.add(list);
		}
		db.close();
	}
	return childData;
}

 

4)整體代碼

具體實現代碼如下:

 

package cn.lyz.mobilesafe.engine;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * 獲取常用號碼
 * @author liuyazhuang
 *
 */
public class CommonNumberService {
	
	private Context context;
	
	public CommonNumberService(Context context) {
		super();
		this.context = context;
	}
	
	/**
	 * 將數據類拷貝到files目錄
	 */
	public void copyDbToFilesDir(){
		//將數據庫拷貝到files目錄
		File file = new File(context.getFilesDir(), commonnum.db);
		if(!file.exists()){
			try {
				InputStream in = context.getAssets().open(commonnum.db);
				OutputStream out = new FileOutputStream(file);
				byte[] buffer = new byte[1024];
				int len = 0;
				while((len = in.read(buffer)) != -1){
					out.write(buffer, 0, len);
				}
				out.close();
				in.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 得到組數據
	 * @return
	 */
	public List> getGroupData(){
		List> groupData = new ArrayList>();
		File file = new File(context.getFilesDir(), commonnum.db);
		SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
		if(db.isOpen()){
			Cursor c = db.query(classlist, new String[]{name, idx}, null, null, null, null, null);
			while(c.moveToNext()){
				Map map = new HashMap();
				String name = c.getString(c.getColumnIndex(name));
				String idx = c.getString(c.getColumnIndex(idx));
				map.put(name, name);
				map.put(idx, idx);
				groupData.add(map);
			}
			c.close();
			db.close();
		}
		return groupData;
	} 
	
	/**
	 * 得到子條目的數據
	 * @return
	 */
	public List>> getChildData(){
		List>> childData = new ArrayList>>();
		List> groupData =  this.getGroupData();
		File file = new File(context.getFilesDir(), commonnum.db);
		SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
		if(db.isOpen()){
			for(int i = 0; i < groupData.size(); i++){
				String idx = groupData.get(i).get(idx);
				List> list = new ArrayList>();
				Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null);
				while(c.moveToNext()){
					Map map = new HashMap();
					String name = c.getString(c.getColumnIndex(name));
					String number = c.getString(c.getColumnIndex(number));
					map.put(name, name);
					map.put(number, number);
					list.add(map);
				}
				c.close();
				childData.add(list);
			}
			db.close();
		}
		return childData;
	}
}

 

2、界面顯示類CommonNumberActivity

在這個類中我們主要實現了,獲取界面控件,然後調用CommonNumberService類中方法,給界面封裝數據,同時設置ExpandableListView子條目的點擊事件,激活撥打電話接界面,並將選擇的電話號碼傳遞到撥打電話界面。
具體實現代碼如下:

 

package cn.lyz.mobilesafe.activity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.SimpleExpandableListAdapter;
import cn.lyz.mobilesafe.R;
import cn.lyz.mobilesafe.engine.CommonNumberService;

/**
 * 常用號碼
 * @author liuyazhuang
 *
 */
public class CommonNumberActivity extends Activity {
	private ExpandableListView elv_common_number;
	private CommonNumberService service;
	private SimpleExpandableListAdapter adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.common_number);
		elv_common_number = (ExpandableListView) findViewById(R.id.elv_common_number);
		this.service = new CommonNumberService(this);
		//將數據庫拷貝到files目錄
		service.copyDbToFilesDir();
		//獲取組數據
		List> groupData = service.getGroupData();
		//獲取子條目數據
		List>> childData = service.getChildData();
		adapter = new SimpleExpandableListAdapter(
				this, 
				groupData, 
				android.R.layout.simple_expandable_list_item_1, 
				new String[]{name}, 
				new int[]{android.R.id.text1}, 
				childData, 
				android.R.layout.simple_expandable_list_item_2, 
				new String[]{name, number}, 
				new int[]{android.R.id.text1, android.R.id.text2});
		elv_common_number.setAdapter(adapter);
		
		elv_common_number.setOnChildClickListener(new MyOnChildClickListener());
	}
	
	/**
	 * 點擊事件
	 * @author liuyazhuang
	 *
	 */
	private class MyOnChildClickListener implements OnChildClickListener{

		@Override
		public boolean onChildClick(ExpandableListView parent, View v,
				int groupPosition, int childPosition, long id) {
			Map map = (Map) adapter.getChild(groupPosition, childPosition);
			String number = map.get(number);
			Intent intent = new Intent();
			intent.setAction(Intent.ACTION_DIAL);
			intent.setData(Uri.parse(tel:+number));
			startActivity(intent);
			return false;
		}
		
	}
}

 

3、界面布局common_number.xml

這個布局很簡單,就是放置了一個ExpandableListView

具體實現如下:

 




    

 

三、運行效果

height=362

height=351

height=386

 

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