編輯:關於Android編程
有些Android手機中會帶有一些常用號碼的功能,比如訂餐電話、公共電話、航空機票,等等諸如此類的服務,點擊相應的號碼會自動彈出撥打電話的界面。那下面我們就一起來實現一個手機常用號碼功能的小例子吧。
首先,這些常用號碼放置在一個SQLite數據庫中,我們將這些號碼從數據庫中讀取出來,按照相應的順序顯示到Android系統提供的ExpandableListView中(有關ExpandableListView的詳細用法請大家參考Android官方文檔,我在這裡就不多說了),然後給每個條目設置點擊事件,在點擊事件中激活撥打電話的界面,並將相應的號碼傳遞到撥打電話的界面。
好了,原理講完了,是不是很簡單呢?下面,我們就一起來實現這些具體的功能吧。
我們首先將數據庫放置在Android項目下的assets目錄
如下圖:

新建數據操作類CommonNumberService,這個類中主要有4個方法,一個是構造方法,在構造方法中我們將Android上下文對象傳遞到這個類中,其他3個方法實現了將數據庫拷貝到/data/data/應用包名/files目錄,然後實現數據的查詢操作。
在構造方法中,我們將上下文對象傳遞到這個類中
具體實現代碼如下:
private Context context;
public CommonNumberService(Context context) {
super();
this.context = context;
}
具體代碼如下:
/** * 得到組數據 * @return */ public List
具體代碼如下:
/** * 得到子條目的數據 * @return */ public List>> getChildData(){ List
>> childData = new ArrayList
>>(); List
> 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 > list = new ArrayList >(); Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null); while(c.moveToNext()){ Map map = new HashMap (); 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; }
具體實現代碼如下:
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> getGroupData(){
List> groupData = new ArrayList>();
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 map = new HashMap();
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>> getChildData(){
List>> childData = new ArrayList>>();
List> 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> list = new ArrayList>();
Cursor c = db.query(table + idx, new String[]{_id, number, name}, null, null, null, null, null);
while(c.moveToNext()){
Map map = new HashMap();
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;
}
}
在這個類中我們主要實現了,獲取界面控件,然後調用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> groupData = service.getGroupData();
//獲取子條目數據
List>> 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 map = (Map) 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;
}
}
}
這個布局很簡單,就是放置了一個ExpandableListView
具體實現如下:



Android開發之ScrollView中嵌套ListView的解決方案
在工作中,曾多次碰到ScrollView嵌套ListView的問題,網上的解決方法有很多種,但是雜而不全。我試過很多種方法,它們各有利弊。 在這裡我將會從使用Sc
Eclipse導入Android項目的正確方法
直接上圖: 在android 中導入項目後 包出現錯誤的解決方法 選中項目,右擊打開Proper
理解Volley -- Android 學習之路
介紹Android中的網絡請求一般就是兩種 HttpURLConnection 和HttpClient,不論是哪一種在使用的時候都是經過一系列的封裝 很繁瑣有沒有,而Go
Android 項目的代碼混淆,Android proguard 使用說明
簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼,我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代