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

有些Android手机中会带有一些经常使用号码的功能,比方订餐电话、公共电话、航空机票,等等诸如此类的服务,点击对应的号码会自己主动弹出拨打电话的界面。

那以下我们就一起来实现一个手机经常使用号码功能的小样例吧。

一、原理

首先。这些经常使用号码放置在一个SQLite数据库中,我们将这些号码从数据库中读取出来。依照对应的顺序显示到Android系统提供的ExpandableListView中(有关ExpandableListView的具体使用方法请大家參考Android官方文档,我在这里就不多说了),然后给每一个条目设置点击事件。在点击事件中激活拨打电话的界面。并将对应的号码传递到拨打电话的界面。

好了,原理讲完了,是不是非常easy呢?以下,我们就一起来实现这些详细的功能吧。

二、实现

1、准备数据库

我们首先将数据库放置在Android项目下的assets文件夹

例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

这个布局非常easy,就是放置了一个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程序猿最主要的开发常识和规范,我在这里仅仅是为了方便直接写在了类和布局文件里。

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

  1. I.MX6 Android 移除 Settings wifi功能

    /********************************************************************* * I.MX6 Android 移除 Settings w ...

  2. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  3. Android 实现登录界面和功能实例

    近期一个android小程序须要登录功能,我简单实现了一下.如今记录下来也当做个笔记,同一时候也希望能够相互学习.所以,假设我的代码有问题,还各位请提出来.多谢了! 以下.就简述一下此实例的主要内容: ...

  4. android不知不觉偷拍他人功能实现(手机关闭依然拍照)【申明:来源于网络】

    android不知不觉偷拍他人功能实现(手机关闭依然拍照)[申明:来源于网络] 地址:http://blog.csdn.net/huangxiaoguo1/article/details/536660 ...

  5. 用Eclipse编写Android程序的代码提示功能

    用Eclipse编写Android程序的代码提示功能主要是在java和xml文件中,有时候会失效,默认的提示功能有限. 1)java文件自动提示     Window->Preferences- ...

  6. Android O 正式版新功能

    ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...

  7. Eclipse Android 代码自己主动提示功能

    Eclipse Android 代码自己主动提示功能 Eclipse for android 实现代码自己主动提示智能提示功能.介绍 Eclipse for android 编辑器中实现两种主要文件 ...

  8. Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能。

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发之清除缓存功能实现方法,可以集成在自己的app中,增加一个新功能. 下面是一个效果图 ...

  9. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

随机推荐

  1. kvm的4中网络模型(qemu-kvm)

    1. 隔离模式(类似vmare中仅主机模式):虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上,所有的虚拟机能够相互通信. 2. 路由模式:相当于虚拟 ...

  2. CSRF verification failed. Request aborted. 表单提交方法为POST时的报错

    本人所用Django版本为1.11,在设置请求方法为POST时,遇到标题中的错误,尝试了多种方法,最终通过下面的操作来修复: 在template文件中添加图中红框部分 接着,导入csrf_exempt ...

  3. 杭电 1596 find the safest road (最小路径变形求最大安全度)

    Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1 间的实数(包括0,1),一条从u 到 v 的 ...

  4. 【Codeforces 1006D】Two Strings Swaps

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 注意只能改变a不能改变b 然后只要让a[i],b[i],a[n-i-1],b[n-i-1]这4个字符能凑成两对.全都一样就可以了 分类讨论下就 ...

  5. luogu2770 航空路线问题

    前置技能:HDU3376 Matrix Again 所以看到这个题,我们也会想着用最大费用最大流解决,因为从起点飞到终点再飞回来,就等于从起点飞两次到终点且这两次飞行除了起点终点之外没有访问超过一次的 ...

  6. [USACO10FEB]慢下来Slowing down

    线段树  树的dfs序 来自   洛谷 P1982   的翻译 by  GeneralLiu 来自 jzyz 的翻译 %mzx 线段树  dfs序 数据结构的应用 “数据结构 是先有需求 再有应用” ...

  7. [Vijos1617] 超级教主(DP + 单调队列)

    传送门 设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量. 所以 f[i] = max(f[i], f[j] + (sum[i] - sum[j]) - i * 100) ( 0 &l ...

  8. docker持续集成部署、csphere监控平台【转:http://blog.csdn.net/java_dyq/article/details/51997024】

    为什么使用Docker “ 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docker.com ...

  9. Python从文件中读取字符串,用正则表达式匹配中文字符的问题

    2013-07-27 21:01:37|           在Windows下,用Python从.txt文件中读取字符串,并用正则表达式匹配中文,在网上看了方法,用的时候发现中文没有被匹配.     ...

  10. [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp

    品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...