转载请注明出处: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. 22. SCHEMA_PRIVILEGES

    22. SCHEMA_PRIVILEGES SCHEMA_PRIVILEGES表提供有关schema(数据库)特权的信息.它从mysql.db系统表中获取其值. SCHEMA_PRIVILEGES表有 ...

  2. idea Error:(65, 27) java: 未结束的字符串文字

    今天在使用IDEA的时候,出现了这个错误,原因项目文件编码不一致导致的,解决方法是: 将项目的文件编码全改成一致(UTF-8),如下图所示:

  3. CSS3---渲染属性

    1.计数器 CSS3计数器( CSS Counters )可以允许我们使用css对页面中的任意元素进行计数,实现类似于有序列表的功能.与有序列表相比,它的突出特性在于可以对任意元素计数,同时实现个性化 ...

  4. Python机器学习及实践+从零开始通往Kaggle竞赛之路

    内容简介 本书面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读者熟悉并且掌握当下最流行的机器学习.数 ...

  5. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  6. 【HDU 3037】Saving Beans(卢卡斯模板)

    Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...

  7. zoj 2818 Root of the Problem

    Root of the Problem Time Limit: 2 Seconds      Memory Limit: 65536 KB Given positive integers B and ...

  8. [HDU2896]病毒侵袭(AC自动机)

    传送门 题目中文描述,赞! 除了val记录id以外就是模板. 注意:每次数组都要清0.0 ——代码 #include <cstdio> #include <queue> #in ...

  9. hdu 4421 和poj3678类似二级制操作(2-sat问题)

    /* 题意:还是二进制异或,和poj3678类似 建边和poj3678一样 */ #include<stdio.h> #include<string.h> #include&l ...

  10. hdu 1043 A*

    http://www.cnblogs.com/183zyz/archive/2011/08/12/2135827.html #include<stdio.h> #define N 3630 ...