转载请注明出处: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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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{@Overridepublic 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" ><ExpandableListViewandroid: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程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

Android之——常用手机号码功能相关推荐

  1. android 一些常用的功能方法代码块

    原文地址:http://www.2cto.com/kf/201208/151990.html 我们这些苦逼的程序员在工作中,我们的每一个老板都希望我们都能把手头的工作做好的,而且是越快越好,那我们要怎 ...

  2. android edittext控件常用属性,Android_Android EditText常用属性功能汇总,本文总结分析了Android EditText常 - phpStudy...

    Android EditText常用属性功能汇总 本文总结分析了Android EditText常用属性.分享给大家供大家参考,具体如下: android:hint="请输入数字!" ...

  3. Android 常用开发功能 博客导航

    转载地址:http://blog.csdn.net/ciqing123/article/details/52931663?locationNum=16&fps=1 简介:第一次在CSDN上发表 ...

  4. Android开发常用功能 https://www.2cto.com/kf/201611/561847.html

    Android开发常用功能 2016-11-03 09:43:58          来源:EvanJames的专栏 收藏   我要投稿 1.定时器的实现 (1)采用Handler的postDelay ...

  5. android studio 常用功能,Android Studio 1.0正式版初体验——常用功能使用指南

    上一篇文章中(见 http://www.linuxidc.com/Linux/2014-12/110968.htm),我们把Android Studio的平台都搭建起来了,这一篇文章,将介绍Andro ...

  6. Android Studio常用快捷键、插件和功能

    这篇文章只是用来记录下自己工作过程中经常使用的一些东西,后面会持续更新中(只是个人零零散散的记录) 1.常用快捷键 代码提示助手: Ctrl+空格 Ctrl+alt+空格 自动提示.类似eclipse ...

  7. android屏幕密度高度,Android获取常用辅助方法(获取屏幕高度、宽度、密度、通知栏高度、截图)...

    我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现.下面就分享一下Android中常用的一些辅助方法: 获取屏幕高度: /** * 获得屏幕高度 * @para ...

  8. android中常用的快捷键

    2019独角兽企业重金招聘Python工程师标准>>> android中常用的快捷键 Eclipse快捷键-方便查找,呵呵,记性不好 行注释/销注释 Ctrl+/  块注释/销注释/ ...

  9. [Android Studio] Android Studio常用快捷键

    [Android Studio] Android Studio常用快捷键 (会持续更新)这边讲的常用快捷键是指做完Keymap到Eclipse后的,不是纯Android Studio的,这边主要讲下比 ...

最新文章

  1. Clang:LLVM的C语言家族前端
  2. DM***的第二阶段EIGRP
  3. AT91RM9200+pcf8563在linux2.6.20下的调试心得
  4. python语言及其应用-[读书笔记] Python语言及其应用
  5. Linux 常用命令与设置
  6. Android之ListView原理学习与优化总结
  7. 突破领域边界,探索文创文保新趋势
  8. html 表单控制器,c# – html表单发布到mvc控制器
  9. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程
  10. 异或算法在算法求解中的妙用
  11. Rtmp协议看一篇就够了
  12. metrics类型 普罗米修斯_普罗米修斯 -- 快速构建你的业务监控平台
  13. mysql ibd恢复数据_mysql通过ibd恢复数据
  14. 关于面试技巧和简历写法的一些总结
  15. 为什么中国公司要让员工用英文名或者花名?
  16. 安装向导无法创建文件夹
  17. 自定义SSLSocketFactory
  18. Python 安装PyQt5失败:Permission denied:d3dcompiler_47.dll
  19. 书呆子rico_Excel书呆子的夏季赠品
  20. 解决迅雷无法使用右键下载的问题

热门文章

  1. Facebook 秘钥散列
  2. Linux系统管理-audit文件太多导致du -sh命令卡死
  3. 朱刘算法 有向图的最小生成树
  4. 上手快、门槛低,微信小程序成“就业大户”
  5. java丐帮_java多线程学习笔记(八)
  6. jwt单点登录 和防重放攻击
  7. 51单片机实现两路AD检测、数码管显示、串口获取
  8. icloud 照片导出_如何将iCloud照片用作Apple TV的屏幕保护程序
  9. [N9H30]在例程中使用printf导致程序无法运行
  10. 游戏加盟能赚钱?游戏代理加盟优势好处是什么?