本文通过一个获取所有联系人实例来展示如何获取其他应用数据以及运行时权限申请过程。

  1. AndroidManifest.xml加入如下权限
  1. 声明一个listView存放取到的联系人信息;检测是否有对应权限,如果没有则请求对应权限,权限授予后会有相应的回调方法。
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView contractsView = findViewById(R.id.contacts_view);        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, contactsList);        contactsView.setAdapter(adapter);        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) !=                PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(this,                    new String[]{Manifest.permission.READ_CONTACTS}, 1);        } else {            readContacts();        }    }
  1. 权限授予后的回调方法。
 @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(this, "You denied the permission", Toast.LENGTH_SHORT).show();                }                break;            default:        }    }
  1. 读取联系人,使用ContentResolver的query()方法,传入uri以及其他过滤参数,返回值为Cursor对象。遍历Cursor并放入listview中。
 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 displatName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));                    String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));                    contactsList.add(displatName + "\n" + number);                }                adapter.notifyDataSetChanged();            }        } catch (Exception e) {            e.printStackTrace();        } finally {            if (cursor != null) {                cursor.close();            }        }    }

更多相关文章

  1. Android(安卓)腾讯面试Glide源码解析 3分钟手写最牛框架 看完成
  2. Android(安卓)TextView实现点击展开动画效果
  3. Handler, Looper, MessageQueue, Message源码详细分析
  4. Android(安卓)多进程编程 15问15答!
  5. setContentView( )方法
  6. Android开发之异步详解(二)之AsyncTask
  7. Android(安卓)APP tcpdump抓包方法
  8. NDK DEBUG方法
  9. Android(安卓)操作蓝牙Ble时数据转换的常用方法

随机推荐

  1. android滑动之Scroller
  2. [Android] Json格式解析和文字图片传输
  3. Android开机流程
  4. (zz)android HAL实例解析
  5. android正则并不完全兼容java正则
  6. Android开发框架模式MVC、MVP使用总结
  7. 模拟android 的 图形 锁屏
  8. Android 网络操作常用的两个类
  9. Android捕获全局异常
  10. android微信分享、微信支付的一些坑