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

缥帙各舒散,前后互相逾。这篇文章主要讲述Android之——经常使用手机号码功能相关的知识,希望能为你提供帮助。

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

有些android手机中会带有一些经常使用号码的功能,比方订餐电话、公共电话、航空机票,等等诸如此类的服务,点击对应的号码会自己主动弹出拨打电话的界面。
那以下我们就一起来实现一个手机经常使用号码功能的小样例吧。
一、原理
首先。这些经常使用号码放置在一个SQLite数据库中,我们将这些号码从数据库中读取出来。依照对应的顺序显示到Android系统提供的ExpandableListView中(有关ExpandableListView的具体使用方法请大家參考Android官方文档,我在这里就不多说了),然后给每一个条目设置点击事件。在点击事件中激活拨打电话的界面。并将对应的号码传递到拨打电话的界面。

好了,原理讲完了,是不是非常easy呢?以下,我们就一起来实现这些详细的功能吧。
二、实现
1、准备数据库我们首先将数据库放置在Android项目下的assets文件夹
例如以下图:
Android之——经常使用手机号码功能

文章图片

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 = https://www.songbingjia.com/android/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)获取经常使用号码子条目数据【Android之——经常使用手机号码功能】详细代码例如以下:

/** * 得到子条目的数据 * @return */ public List< List< Map< String, String> > > getChildData(){ List< List< Map< String, String> > > childData = https://www.songbingjia.com/android/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 = https://www.songbingjia.com/android/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 = https://www.songbingjia.com/android/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 = https://www.songbingjia.com/android/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>


三、执行效果
Android之——经常使用手机号码功能

文章图片


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

文章图片

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

文章图片

四、温馨提示
大家能够到链接http://download.csdn.net/detail/l1028386804/8980263下载实例中用到的数据库commonnum.db文件

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






    推荐阅读