首先,我把把昨天忘記了的兩張設置向導的圖片放出來先

我們從上麵的第一張圖片可以看到,我們有一個選擇聯係人這一操作,那麼怎樣才能獲取到手機裏麵的聯係人呢,其實方法有很多的,現在我們來講一下我們這個項目裏麵用到的方法
其實要想知道怎樣獲取手機裏麵的聯係人,去看一下Android自己的源碼就知道的了
我們隻要把platform/packages/providers/ContactsProvider這一部分的內容下載下來看看就可以的啦
下麵是我下載之後,打開裏麵的AndroidManifest的內容
我們可以看一下第一個provider,裏麵就有我們想要的uri還有它已經寫好了的類了,各位有興趣的可以去看一下是如何實現的, 其實我們要獲取的東西,都是存放在一個數據庫裏麵的,我們不妨把那個數據庫拿出來看一下,拿到那個數據庫也很簡單,隻要在Eclipse裏麵的ddms界麵裏麵,在右上邊 那個contacts2.db就是我們想要的東西啦我們可以把它導出來,然後用SQLite
Database browser來打開它 獲取手機裏麵的聯係人,我們隻要關注三個表就可以啦,一個是raw_contacts data還有一個mime_type這三個表就行啦mime_type存放的就是一些類型,是電話,還是短信,還是E-mail這些data就是存放一些數據的東西raw_contacts就是存放一些命名什麼的這三個表的關係就是下麵一樣的啦 從上麵的可以看到,我們可以通過raw_contacts拿到那個id還有display_name然後就去data那裏找到對應的raw_contact_id,這樣就可以獲得對應的數據啦,然後還可以通過mimetype_id在mime_type表裏麵找出想要的類型好啦,原理就是這樣啦,下麵我們來看一下代碼怎麼寫我們先要用一個model類來存放我們的數據com.xiaobin.security.domain.ContactInfo
-
package com.xiaobin.security.domain;
-
-
public class ContactInfo
-
{
-
private String name;
-
private String phone;
-
-
public String getName()
-
{
-
return name;
-
}
-
public void setName(String name)
-
{
-
this.name = name;
-
}
-
public String getPhone()
-
{
-
return phone;
-
}
-
public void setPhone(String phone)
-
{
-
this.phone = phone;
-
}
-
-
}
-
複製代碼
然後呢,我們就可以寫我們獲得手機聯係人的代碼啦新建一個類com.xiaobin.security.engine.ContactInfoService
-
package com.xiaobin.security.engine;
-
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import android.content.ContentResolver;
-
import android.content.Context;
-
import android.database.Cursor;
-
import android.net.Uri;
-
-
import com.xiaobin.security.domain.ContactInfo;
-
-
public class ContactInfoService
-
{
-
private Context context;
-
-
public ContactInfoService(Context context)
-
{
-
this.context = context;
-
}
-
-
public List<ContactInfo> getContactInfos()
-
{
-
List<ContactInfo> infos = new ArrayList<ContactInfo>();
-
ContactInfo info;
-
-
ContentResolver contentResolver = context.getContentResolver();
-
//在源碼的AndroidManifest裏麵可以看到這些uri
-
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
-
Uri dataUri = Uri.parse("content://com.android.contacts/data");
-
Cursor cursor = contentResolver.query(uri, null, null, null, null);
-
while(cursor.moveToNext())
-
{
-
info = new ContactInfo();
-
String id = cursor.getString(cursor.getColumnIndex("_id"));
-
String name = cursor.getString(cursor.getColumnIndex("display_name"));
-
info.setName(name);
-
//通過raw_contacts裏麵的id拿到data裏麵對應的數據
-
Cursor dataCursor = contentResolver.query(dataUri, null, "raw_contact_id = ? ", new String[] {id}, null);
-
while(dataCursor.moveToNext())
-
{
-
String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
-
//根據類型,隻要電話這種類型的數據
-
if(type.equals("vnd.android.cursor.item/phone_v2"))
-
{
-
String number = dataCursor.getString(dataCursor.getColumnIndex("data1"));//拿到數據
-
info.setPhone(number);
-
}
-
}
-
dataCursor.close();
-
infos.add(info);
-
info = null;
-
}
-
cursor.close();
-
return infos;
-
}
-
-
}
-
複製代碼
因為我們是點擊按鈕,然後打開一個activity,然後選擇好了之後,再把值返回到原來的activity那裏的,所以我們就要用到startActivityForResult這個方法啦好,我們來看一下setup_guide3這個向導頁麵的邏輯是怎樣寫的com.xiaobin.security.ui.SetupGuide3Activity
-
package com.xiaobin.security.ui;
-
-
import android.app.Activity;
-
import android.content.Context;
-
import android.content.Intent;
-
import android.content.SharedPreferences;
-
import android.content.SharedPreferences.Editor;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.Button;
-
import android.widget.EditText;
-
import android.widget.Toast;
-
-
import com.xiaobin.security.R;
-
-
public class SetupGuide3Activity extends Activity implements OnClickListener
-
{
-
private Button bt_next;
-
private Button bt_pervious;
-
private Button bt_select;
-
private EditText et_phoneNumber;
-
private SharedPreferences sp;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.setup_guide3);
-
-
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
-
-
bt_next = (Button) findViewById(R.id.bt_guide_next);
-
bt_pervious = (Button) findViewById(R.id.bt_guide_pervious);
-
bt_select = (Button) findViewById(R.id.bt_guide_select);
-
bt_next.setOnClickListener(this);
-
bt_pervious.setOnClickListener(this);
-
bt_select.setOnClickListener(this);
-
-
et_phoneNumber = (EditText) findViewById(R.id.et_guide_phoneNumber);
-
}
-
-
//重寫這個方法,從acitivty裏麵拿到數據
-
@Override
-
protected void onActivityResult(int requestCode, int resultCode, Intent data)
-
{
-
super.onActivityResult(requestCode, resultCode, data);
-
//resultCode是乃至區分拿到的activity是從那一個activity裏麵拿到的
-
-
if(data != null)
-
{
-
String number = data.getStringExtra("number");
-
et_phoneNumber.setText(number);
-
}
-
}
-
-
@Override
-
public void onClick(View v)
-
{
-
switch(v.getId())
-
{
-
case R.id.bt_guide_select :
-
Intent selectIntent = new Intent(this, SelectContactActivity.class);
-
//啟動一個activity來獲取數據,獲取到的數據是在重寫的onActivityResult這個方法裏麵拿到的
-
startActivityForResult(selectIntent, 1);
-
break;
-
-
case R.id.bt_guide_next :
-
String number = et_phoneNumber.getText().toString().trim();
-
if(number.equals(""))
-
{
-
Toast.makeText(this, "安全號碼不能為空", Toast.LENGTH_SHORT).show();
-
}
-
else
-
{
-
Editor editor = sp.edit();
-
editor.putString("number", number);
-
editor.commit();
-
-
Intent intent = new Intent(this, SetupGuide4Activity.class);
-
finish();
-
startActivity(intent);
-
//這個是定義activity切換時的動畫效果的
-
overridePendingTransition(R.anim.translate_in, R.anim.translate_out);
-
}
-
break;
-
case R.id.bt_guide_pervious :
-
-
Intent i = new Intent(this, SetupGuide2Activity.class);
-
finish();
-
startActivity(i);
-
//這個是定義activity切換時的動畫效果的
-
overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
-
break;
-
-
default :
-
break;
-
}
-
}
-
-
}
-
複製代碼
我們還要新建一個類用來做為選擇的呢com.xiaobin.security.ui.SelectContactActivity
-
package com.xiaobin.security.ui;
-
-
import java.util.List;
-
-
import android.app.Activity;
-
import android.content.Intent;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.view.ViewGroup;
-
import android.widget.AdapterView;
-
import android.widget.AdapterView.OnItemClickListener;
-
import android.widget.BaseAdapter;
-
import android.widget.ListView;
-
import android.widget.TextView;
-
-
import com.xiaobin.security.R;
-
import com.xiaobin.security.domain.ContactInfo;
-
import com.xiaobin.security.engine.ContactInfoService;
-
-
public class SelectContactActivity extends Activity
-
{
-
private ListView lv;
-
private List<ContactInfo> infos;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.select_contact);
-
-
infos = new ContactInfoService(this).getContactInfos();
-
-
lv = (ListView) findViewById(R.id.lv_select_contact);
-
lv.setAdapter(new SelectContactAdapter());
-
lv.setOnItemClickListener(new OnItemClickListener()
-
{
-
@Override
-
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
-
{
-
String number = infos.get(position).getPhone();
-
Intent intent = new Intent();
-
intent.putExtra("number", number);
-
//把要返回的數據設置進去,便通過onActivityResult(int, int, Intent)拿到
-
setResult(1, intent);
-
finish();
-
}
-
});
-
}
-
-
//=================================================================================
-
-
private class SelectContactAdapter extends BaseAdapter
-
{
-
-
@Override
-
public int getCount()
-
{
-
return infos.size();
-
}
-
-
@Override
-
public Object getItem(int position)
-
{
-
return infos.get(position);
-
}
-
-
@Override
-
public long getItemId(int position)
-
{
-
return position;
-
}
-
-
@Override
-
public View getView(int position, View convertView, ViewGroup parent)
-
{
-
ContactInfo info = infos.get(position);
-
View view;
-
ContactViews views;
-
if(convertView == null)
-
{
-
views = new ContactViews();
-
view = View.inflate(SelectContactActivity.this, R.layout.contact_item, null);
-
views.tv_name = (TextView) view.findViewById(R.id.tv_contact_name);
-
views.tv_number = (TextView) view.findViewById(R.id.tv_contact_number);
-
views.tv_name.setText("聯係人:" + info.getName());
-
views.tv_number.setText("聯係電話:" + info.getPhone());
-
-
view.setTag(views);
-
}
-
else
-
{
-
view = convertView;
-
}
-
return view;
-
}
-
-
}
-
-
private class ContactViews
-
{
-
TextView tv_name;
-
TextView tv_number;
-
}
-
-
}
-
複製代碼
這個類是非常簡單的,隻有一個listView大家也可以看到,這個類裏麵有一個adapter,這個是為了方便,所以寫在裏麵的,而且那個listview我們也用到了上一次的優化方法如果有什麼不了解的,可以回去看一下我們前麵的那個Android項目實戰--手機衛士06--GridView的優化與修改Button的顯示樣式好啦,下麵是activity的布局文件,還有listview的布局文件select_contact.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:andro
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:background="@android:color/white"
-
android:orientation="vertical" >
-
-
<ListView
-
android:
-
android:layout_width="match_parent"
-
android:layout_height="match_parent" />
-
-
</LinearLayout>
-
複製代碼
contact_item.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:andro
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:orientation="vertical" >
-
-
<TextView
-
android:
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"/>
-
-
<TextView
-
android:
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"/>
-
-
</LinearLayout>
-
複製代碼
好啦,獲取聯係人的操作,我們也差不多完成的啦,現在還要加上兩個權限
-
<uses-permission android:name="android.permission.READ_CONTACTS" />
-
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
複製代碼
到現在為止,獲取聯係人的操作就完成的啦,因為之前都是清一色的切換效果,所以我現寫多了兩個切換效果,大家可以看看,也是很簡單的至於怎麼寫那些效果,那就要看一下我們的前一篇文章啦translate_in.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<translate xmlns:andro
-
android:fromXDelta="100%p"
-
android:toXDelta="0"
-
android:duration="400" >
-
<!-- 100%p是指從看不到的地方進入到0這個地方 -->
-
-
</translate>
-
複製代碼
translate_out.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<translate xmlns:andro
-
android:fromXDelta="0"
-
android:toXDelta="-100%p"
-
android:duration="400" >
-
<!-- 100%p是指從看不到的地方進入到0這個地方 -->
-
-
</translate>
-
複製代碼
好啦,今天要說的基本上已經說完的啦如果有什麼不明白的,或有什麼指導的,歡迎留言 Security_08獲取手機聯係人.rar (641.15
KB, 下載次數: 116)
2013-10-9 15:24 上傳
點擊文件名下載附件
下載積分: 下載豆 -2
|