ContentProvier trong android bao gồm 2 loại chính là android platform provider và custom content provider
Trong ví dụ này mình sẽ giới thiệu với các bạn cách sử dụng android platform provider tức là các provider do hệ điều hành cung cấp như: đọc danh bạ, lịch sử cuộc gọi hoặc danh sách các bài hát…
Để làm rõ vấn đề này mình làm 1 app đơn giản với 3 button khi click vào từng button mình sẽ log ra danh bạ, lịch sử cuộc gọi và danh sách các bài hát trong máy của mình và ghi kết quả ra logcat. Các bạn có thể nghiên cứu các provider khác tương tự theo link api
http://developer.android.com/reference/android/provider/package-summary.html
Để làm ví dụ này các bạn cần thực hiện theo các bước sau
Bước 1: mở file res->value->Strings.xml
<resources>
<string name="app_name">UseContentProviderAndroid</string>
<string name="getAllContacts">Get All Contacts</string>
<string name="getAllMusic">Get All Music</string>
<string name="getAllCallLogs">Get All Call Logs</string>
</resources>
Bước 2: mở file res->layout->layout_mainactivity.xml
<?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"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="20dp" >
<Button
android:id="@+id/btgetAllContacts"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/getAllContacts" />
<Button
android:id="@+id/btgetAllMusic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/getAllMusic" />
<Button
android:id="@+id/btgetAllCallLogs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/getAllCallLogs" />
</LinearLayout>
Bước 3 mở file AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="truongbs.fet.hut.usecontentprovider"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
</manifest>
Note: để đọc được danh bạ các bạn cần khai báo quyền
<uses-permission android:name=”android.permission.READ_CONTACTS” />
Để đọc được lịch sử cuộc gọi bạn cần khai báo quyền
<uses-permission android:name=”android.permission.READ_CALL_LOG”/>
Bước 4: mở file MainActivity.java
package truongbs.fet.hut.usecontentprovider;
import java.util.Date;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
//http://developer.android.com/reference/android/provider/package-summary.html
public class MainActivity extends Activity implements OnClickListener {
private Button btgetAllCallLogs, btgetAllContacts, btgetAllMusic;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_mainactivity);
// link button den layout de dieu khien
btgetAllCallLogs = (Button) findViewById(R.id.btgetAllCallLogs);
btgetAllContacts = (Button) findViewById(R.id.btgetAllContacts);
btgetAllMusic = (Button) findViewById(R.id.btgetAllMusic);
// dang ky lang nghe su kien onclick vao cac button
btgetAllCallLogs.setOnClickListener(this);
btgetAllContacts.setOnClickListener(this);
btgetAllMusic.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btgetAllCallLogs:
processGetAllCallLogs();
break;
case R.id.btgetAllContacts:
processGetAllContacts();
break;
case R.id.btgetAllMusic:
processGetAllListMusic();
break;
default:
break;
}
}
private void processGetAllListMusic() {
// Log toan bo danh sach bai hat trong dt ra logcat
displayListMusic();
}
private void displayListMusic() {
// lay cac cot nhu trong bang projection
String[] projection = { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION };
ContentResolver cr = getContentResolver();
// get toan bo danh sach bai hat
Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection, null, null, "LOWER(" + MediaStore.Audio.Media.TITLE
+ ") ASC");
Log.d("List Music", "count: " + cursor.getCount());
int count = 0;
while (cursor.moveToNext()) {
count++;
// log toan bo danh sach bai hat ra logcat
Log.d("List Music",
"\ncount: " + count + "\n_id: " + cursor.getString(0)
+ "\n artist: " + cursor.getString(1) + "\ntitle: "
+ cursor.getString(2) + "\ndata: "
+ cursor.getString(3) + "\ndisplay name: "
+ cursor.getString(4) + "\n duration: "
+ cursor.getString(5)
+ "\n--------------------------");
}
cursor.close();
}
// -------------
private void processGetAllContacts() {
// Log toan bo danh ba ra logcat
displayContacts();
}
private void displayContacts() {
ContentResolver cr = getContentResolver();
// lay toan bo danh ba
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
// get id va name cua tung nguoi trong danh ba
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// lay tat ca cac sdt cua ng co _id = id
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
String phoneNo = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
// log toan bo so dien thoai ra logcat
Log.d("List Contacts", "\nName: " + name
+ "|| Phone No: " + phoneNo
+ "\n--------------------------");
}
pCur.close();
}
}
}
cur.close();
}
// ---------------
private void processGetAllCallLogs() {
// Log nhat ky cuoc goi ra logcat
getCallDetails();
}
private void getCallDetails() {
// get toan bo lich su cuoc goi
Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null,
null, null, null);
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
Log.d("Call_Logs", "Call Details :");
while (managedCursor.moveToNext()) {
// lay cac cot trong cursor
String phNumber = managedCursor.getString(number);
String callType = managedCursor.getString(type);
String callDate = managedCursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
String callDuration = managedCursor.getString(duration);
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
// log toan bo lich su cuoc goi ra logcat
Log.d("Call_Logs", "\nPhone Number:--- " + phNumber
+ " \nCall Type:--- " + dir + " \nCall Date:--- "
+ callDayTime + " \nCall duration in sec :--- "
+ callDuration + "\n----------------------------------");
}
managedCursor.close();
}
}
Note:Các bạn có thể theo dõi kết quả thực hiện chương trình trên logcat và màn hình. Khi làm theo ví dụ các bạn có gì không hiểu có thể để lại câu hỏi trên web mình sẽ trả lời các bạn một cách nhanh nhất có thể. Các bạn có thể down full src theo link dưới đây
UseContentProviderAndroid
Kết quả thực hiện chương trình