内容提供者(一)
下面我们介绍Android四大组件之一的内容提供者(ContentResolver)
内容提供者即Android内程序提供外部访问的接口,可以进行数据共享。
需求:通过内容提供者获取通讯录信息,使用ListView显示在自己的程序中。
首先先介绍一下这次我们访问通讯录所需要的权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
//访问通讯录所需要的权限
我们先放上activity_main.xml文件信息
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_item_01">
</ListView>
</android.support.constraint.ConstraintLayout>
接下来我们在放上MainActivity部分的java代码
package com.example.jackson.contentresolver_01;
import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ArrayAdapter<String> arrayAdapter;
List<String> arrayList=new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView=(ListView) findViewById(R.id.list_item_01);
//将数据封装至集合并且通过ArrayAdapter和ListView进行数据绑定
arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayList);
listView.setAdapter(arrayAdapter);//绑定成功将ArrayAdapter中的数据和ListView绑定
//READ_CONTACTS为需要申请的权限
//下列代码为判断是否用户对其所需权限进行授权
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS) !=PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS},1);
//requestPermissions三个参数:MeinActivity实例,使用数组将所需权限传入,返回结果码
}
else//若授权成功则调用Read()方法,将数据存储值ArrayList<>集合中
{
Read();
}
}
//使用系统提供的内容提供者
private void Read() {
Cursor cursor=null;
try {
//对程序信息进行查询返回值仍为cursor
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if (cursor!=null)
while (cursor.moveToNext())
{
//通过键值对数据进行索引
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
arrayList.add(name+"\n"+number);
//使用ArrayLIst存储数据
}
arrayAdapter.notifyDataSetChanged();
//使用notifyDataSetChanged方法刷新LIstView控件信息
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
if (cursor!=null)
{
cursor.close();
//不要忘记关闭内容提供者
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode)
{
case 1:
//通过判断grantResults[]数组中的请求码对用户授权结果进行分析
if (grantResults.length>0&&grantResults[0] ==PackageManager.PERMISSION_GRANTED)
{
Read();
//若授权成功则调用Read()方法,将数据存储值ArrayList<>集合中
}
else
{
Toast.makeText(MainActivity.this,"授权未成功",Toast.LENGTH_SHORT).show();
//未授权成功则给与用户提示
}
}
}
}
最后别忘了在AndroidManifest.xml文件中输入所需要的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.jackson.contentresolver_01">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
//访问通讯录所需要的权限
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
下面放一下效果这是我在通讯录添加的信息
搞定,在后面我会继续介绍内容提供者的相关知识,如创建自己程序的内容提供者。