关于持久化技术我们也差不多都谈过了,然而我们发现这些数据只能在当前的程序实现共享,如果我们想获取其他程序的数据呢?
这时我们就要使用到ContentProvider来实现跨程序数据共享的功能了,使用它我们就可以获取系统的电话簿、短信、媒体库等程序的内容。
内容提供器的使用需要通过Content Resolver来实现,可以通过Context中的getContentResolver()方法获取实例,该类提供一系列的CRUD操作,就SQLite相似。不同的是,ContentResolver中的增删改查都是不接收表名参数的,而是使用一个Uri参数代替,该参数为称为内容URI,有权限以及路径组成,一般权限都是使用程序的包名,路径俄日表名。这样就能很好的区分不同程序不同的表格了。
下面是一个获取手机联系人名称及联系人号码的实例:
package com.example.contactstast;
import java.util.ArrayList;
import java.util.List;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.app.Activity;
import android.database.Cursor;
public class MainActivity extends Activity {
ListView contanctsView;
ArrayAdapter<String> adapter;
List<String> contactList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contanctsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactList);
contanctsView.setAdapter(adapter);
readContacts();
}
private void readContacts() {
Cursor cursor = null;
try {
//查询联系人数据
//ContactsContract已经将Uri做好了封装,所以不需要调用Uri.parse()方法去解析URI字符串
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
cursor = getContentResolver().query(uri, null, null, null, null);
while (cursor.moveToNext()) {
//获取联系人姓名
int columnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String displayName = cursor.getString(columnIndex);
//获取联系人手机号码
int columnIndex2 = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(columnIndex2);
contactList.add(displayName+"\n"+number);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
当然,要记得添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>