内容提供器(ContentProvider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。当一个程序通过内容提供器对其数据提供了外部访问接口,任何其他的应用程序就都可以对这部分数据进行访问。Android系统中 自带的电话簿、短信、媒体库等程序都提供了类似的访问接口,这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能。
对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,需要借助ContentResolve类,可以通过Context中的getContentResolve()方法获取到该类的实例。ContentResolve中的增删改查与数据库中基本类似,但是所有方法都不接受表名参数,而是使用一个Rri参数代替,这个参数的内容被称为内容URI。内容URI给内容提供器中的数据建立了唯一标示符,它主要由两部分组成,权限(authority)和路径(path)。权限是用于不同的应用程序作区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。路径则是用于对同一应用程序中不同的表作区分的,通常都会添加到权限的后边。
可以调用Uri.parse()方法将内容URI字符串解析成Uri对象了
Uri uri=Uri.parse(“content://pathname/tablename”)
package com.example.administrator.mycontentprovide;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button mButton_checkphone;
private ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton_checkphone= (Button) findViewById(R.id.button_checkphone);
mButton_checkphone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resolver=getContentResolver();
//得到电话联系人这个应用的URI,是使用Uri.parse()方法解析出来的结果
Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//查询联系人
//ContactsContract.CommonDataKinds.Phone.NUMBER是电话号码的URI
//ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME是联系人的URI
Cursor cursor=resolver.query(uri,new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME},null,null,null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){
//得到联系人的姓名,其实也可以使用URI的方式来获取
String []names=cursor.getColumnNames();
StringBuffer buffer=new StringBuffer();
//得到联系人的电话号码
for (String name:names){
String value=cursor.getString(cursor.getColumnIndex(name));
buffer.append("字段名"+name+" 字段值"+value);
}
Log.d("联系人", ""+buffer);
cursor.moveToNext();
}
}
});
}
}
需要注意的是,访问系统联系人是需要访问权限的,所以再Manifest中添加一个权限声明
<uses-permission android:name="android.permission.READ_CONTACTS"/>