Android 跨程序共享数据之访问其他应用数据(访问联系人)
跨程序访问其他程序数据很简单,总的来说就是三步:一、动态申请运行时权限,二、按照其格式拼接对应URI获取数据,三、获取到数据后自己显示。本文以获取手机联系人的例子来实现。
首先来看看最后实现效果
由于这里只是做最简单的显示,只是用了最原始的listview。真机调试的,模拟器怎么都无法添加联系人
动态申请获取联系人的权限
代码中Manifest.permission.READ_CONTACTS为读取手机联系人权限,PackageManager.PERMISSION_GRANTED是看用户是否同意了获取该权限,readContacts()是获取联系人的具体方法实现。
//运行时权限申请
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{ Manifest.permission.READ_CONTACTS},1);
}else {
readContacts();
}
/** * 权限监控 * @param requestCode * @param permissions * @param grantResults */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
readContacts();
}else {
Toast.makeText(MainActivity.this,"你拒绝开启该权限!",Toast.LENGTH_SHORT).show();
}
}
}
获取联系人的具体实现
代码中getContentResolver().query()总共有五个参数,
而本文中,ContactsContract.CommonDataKinds.Phone.CONTENT_URI就是别人为我们已经封装好的Uri,其余参数传null。
/** * 读取联系人 */
private void readContacts() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if (cursor!=null){
while (cursor.moveToNext()){
//获取联系人姓名
String contactsName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人电话
String contactsNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(contactsName+"\n"+contactsNumber);
}
arrayAdapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor!=null){
cursor.close();
}
}
}
最后不要忘记在AndroidManifest.xml文件中去声明权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
到这里获取手机联系人的工作就完成了,最后我们来看看整体代码
public class MainActivity extends AppCompatActivity {
private ArrayAdapter arrayAdapter;
private ListView listView;
private List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.contacts_listView);
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
listView.setAdapter(arrayAdapter);
//运行时权限申请
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{ Manifest.permission.READ_CONTACTS},1);
}else {
readContacts();
}
}
/** * 读取联系人 */
private void readContacts() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if (cursor!=null){
while (cursor.moveToNext()){
//获取联系人姓名
String contactsName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人电话
String contactsNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add(contactsName+"\n"+contactsNumber);
}
arrayAdapter.notifyDataSetChanged();
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (cursor!=null){
cursor.close();
}
}
}
/** * 权限监控 * @param requestCode * @param permissions * @param grantResults */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
readContacts();
}else {
Toast.makeText(MainActivity.this,"你拒绝开启该权限!",Toast.LENGTH_SHORT).show();
}
}
}
}