Android之——常用手机号码功能

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47374415

有些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<Map<String, String>> getGroupData(){
	List<Map<String, String>> groupData = new ArrayList<Map<String,String>>();
	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<String, String> map = new HashMap<String, String>();
			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<List<Map<String, String>>> getChildData(){
	List<List<Map<String, String>>> childData = new ArrayList<List<Map<String,String>>>();
	List<Map<String, String>> 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<Map<String, String>> list = new ArrayList<Map<String,String>>();
			Cursor c = db.query("table" + idx, new String[]{"_id", "number", "name"}, null, null, null, null, null);
			while(c.moveToNext()){
				Map<String, String> map = new HashMap<String, String>();
				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<Map<String, String>> getGroupData(){
		List<Map<String, String>> groupData = new ArrayList<Map<String,String>>();
		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<String, String> map = new HashMap<String, String>();
				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<List<Map<String, String>>> getChildData(){
		List<List<Map<String, String>>> childData = new ArrayList<List<Map<String,String>>>();
		List<Map<String, String>> 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<Map<String, String>> list = new ArrayList<Map<String,String>>();
				Cursor c = db.query("table" + idx, new String[]{"_id", "number", "name"}, null, null, null, null, null);
				while(c.moveToNext()){
					Map<String, String> map = new HashMap<String, String>();
					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<Map<String, String>> groupData = service.getGroupData();
		//获取子条目数据
		List<List<Map<String, String>>> 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<String, String> map = (Map<String, String>) 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

具体实现如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ExpandableListView
        android:id="@+id/elv_common_number"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

三、运行效果

四、温馨提示

大家可以到链接http://download.csdn.net/detail/l1028386804/8980263下载实例中用到的数据库commonnum.db文件

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 19:57:32

Android之——常用手机号码功能的相关文章

Android 最常用的快速开发工具类

Android开发的工具类能很好的封装一些常用的操作,以后使用起来也非常方便,我把我经常使用的工具类分享给大家. FileCache: package com.pztuan.common.util; import java.io.File; import android.content.Context; public class FileCache { private File cacheDir; public FileCache(Context context) { // 判断外存SD卡挂载状

android学习常用资料博客目录

android 技术总结 1.android 系统签名 介绍如何使用源码中的  (testkey:普通APK,默认情况下使用,platform:该APK完成一些系统的核心功能,经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system,shared:该APK需要和home/contacts进程共享数据,media:该APK是media/download系统中的一环.)4种密钥公钥进行签名. 2.MVC ListView 介绍什么是MVC以及MVC在SDK中的使用,

Android Studio常用插件

Android Studio常用插件 转载请注明出处:http://blog.csdn.net/crazy1235/article/details/48598803 不得不承认,Android Studio越用越爽.其代码提示和搜索功能相当强大,非常智能.颜色.图片在布局和代码中可以实时预览. 开发的过程中使用一些插件可以事半功倍,下面介绍一些博主开发过程中常用到的一些as插件供大家参考. Android Studio常用插件 ButterKnife codota Genymotion 安装HA

五、Android学习第四天补充——Android的常用控件(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的Android的几个常用控件的使用方法: 一.RadioGroup和RadioButton——单选按钮 二.Checkbox——复选框 三.Toast——提示框,会自动消失 四.ProgressBar——进度条工具 五.ListView——以列表形式将控件显示出来 下面就对这些内容做个详细的解释: 首

[Android Studio] Android Studio常用快捷键

(会持续更新)这边讲的常用快捷键是指做完Keymap到Eclipse后的,不是纯Android Studio的,这边主要讲下比较常用的一些快捷键: Ctrl+G / Ctrl+Alt+Shift+G:查询变量或者函数或者类在哪里被使用或被调用,后者是前者的复杂表现,可以选择查询范围等. Alt+H:查找功能,全局查找 F4:查看类继承关系 F2:查看文档说明(函数使用说明) Ctrl+E:查看最近打开过的文件 Ctrl+Shift+E:查看最近编辑过的文件 double Shift:全局查找,这

android如何实现注销功能

1.首先你的了解一下简单的注销的流程是怎么样 a.简单的举个例子,就像我们经常用的app, 例如qq.当我们点击注销按钮之后,一般都会重新返回登陆界面,这时候我们再按返回键是没有用的. b.在android上面来实现这个功能的话,首先你得了解TaskStack的含义.如果你了解了.请继续下面的步骤c c.我们首先来模拟一下界面.有一个按钮,点击这个按钮我们就实现了注销的功能. 2.接下来就是你怎样去实现你的注销流程,这个流程最终要的一点是你要清楚的了解到你注销的时候,其实是将你的TaskStac

Android Stuido 常用快捷键

Android Stuido 常用快捷键 Ctrl + Z : 撤消 Ctrl + G : 定位行 Ctrl + / : 单行注释 Ctrl + Shift + Z : 恢复 Ctrl + J : 快速生成代码 Ctrl + H : 显示类结构图 Ctrl + P : 方法参数提示 Ctrl + Shift + F10 : 运行 Ctrl + Shift + / : 多行注释 Ctrl + Alt + L : 格式化代码 Ctrl + Shift + C : 复制路径 Ctrl + + / -

7款Android开发者常用的Android UI组件

7款Android开发者常用的Android UI组件 原文  http://news.cnblogs.com/n/506366/ Android 开发是目前最热门的移动开发技术之一,随着开发者的不断努力和 Android 社区的进步,Android 开发技术已经日趋成熟,当然,在 Android 开源社区中也涌现了很多不错的开源 UI 项目,它们可以帮助 Android 开发者更方便快捷地完成想要的功能.本文是 Android 系列的第一篇,主要是向大家推荐一些常用的 Android UI 组

Android中常用的工具类02

1.读取手机联系人信息 一般用在读取手机通讯录上传,这一块比较多. import java.util.ArrayList; import java.util.List; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.provider.ContactsContract.CommonDataKinds.Phon