解析
不同程序处于安全考虑,数据不共享,但是不同程序之间需要进行数据共享,就要使用到Content Provider,实现数据安全共享
两个重要知识点
数据模型
URI
步骤
实例
1、需求:实现app简易读取手机通讯录并显示通讯录姓名列表
2、activit_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show"
></TextView>
</LinearLayout>
3、MainActivity.java
package com.example.content_provider_page;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private String columns = ContactsContract.Contacts.DISPLAY_NAME;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.show);
textView.setText(getQuertData());
}
public CharSequence getQuertData(){
StringBuffer result = new StringBuffer();
// 解析通讯录记录
ContentResolver contentResolver = getContentResolver();
// CONTENT_URI定位通讯录数据
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null , null , null , null );
// 获取姓名字段所在的索引
int dataNameCursorIndex = cursor.getColumnIndex(columns);
// 通过指针进行遍历
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){
String displayName = cursor.getString(dataNameCursorIndex);
result.append(displayName+"\n");
}
return result.toString();
};
}
4、AndroidManifest.xml中开启读取通讯录权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
5、真机上会是弹出提示请求权限,但是虚拟机上需要手动开启,在设置-找到对应应用并开启通讯录权限
6、结果