Android学习--隐式Intent获取联系人信息或电话
2016-03-11 16:54
441 查看
在学习到隐式Intent的时候,接触到要查阅联系人信息以及电话,在翻阅了一些资料后,自己总结了一些点:
如果需要返回联系人信息或电话的时候,要用到的Intent动作为Intent.ACTION_PICK(返回所选择的信息),而如果要拨打电话的时候有两个Intent动作可供选择:Intent.ACTION_DIAL和Intent.ACTION_CALL,两者的不同在于前者是拨好号码,等用户来发起通话;后者是直接拨打电话。所以推荐用Intent.ACTION_DIAL。
第一步、在需要读取或者修改联系人信息的前要在manifests文件下声明读写权限,否则在后续的调用中会出错。
第二步、采用ACTION_PICK为动作声明一个隐式Intent。
第三步、在onActivityResult中获取返回的URI,该URI是指向用户所选的联系人的定位符,通过该URI可以查询联系人数据库从而提取出联系人id与姓名。而通过联系人id可以进一步在数据库中提取出联系人的电话。其中联系人名字和id要在ContactsContract.Contacts中获取,而电话则ContactsContract.CommonDataKinds.Phone中获取。
第四步、获取电话信息后,如需拨打电话则可以创建一个新的隐式Intent,以Intent.ACTION_DIAL为动作进行拨打电话,其中Uri.parse()辅助解析传入的字符串,
而电话号码格式为"tel:10086",tel为指定的协议。
如果需要返回联系人信息或电话的时候,要用到的Intent动作为Intent.ACTION_PICK(返回所选择的信息),而如果要拨打电话的时候有两个Intent动作可供选择:Intent.ACTION_DIAL和Intent.ACTION_CALL,两者的不同在于前者是拨好号码,等用户来发起通话;后者是直接拨打电话。所以推荐用Intent.ACTION_DIAL。
第一步、在需要读取或者修改联系人信息的前要在manifests文件下声明读写权限,否则在后续的调用中会出错。
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
第二步、采用ACTION_PICK为动作声明一个隐式Intent。
mSuspectButton = (Button)v.findViewById(R.id.crime_suspectButton); mSuspectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); //声明隐式Intent,从联系人中获取一个返回信息 startActivityForResult(i , REQUEST_CONTACT); } }
第三步、在onActivityResult中获取返回的URI,该URI是指向用户所选的联系人的定位符,通过该URI可以查询联系人数据库从而提取出联系人id与姓名。而通过联系人id可以进一步在数据库中提取出联系人的电话。其中联系人名字和id要在ContactsContract.Contacts中获取,而电话则ContactsContract.CommonDataKinds.Phone中获取。
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CONTACT){ Uri contactUri = data.getData(); //该数据URI是一个指向用户所选联系人的定位符 Cursor c = getActivity().getContentResolver().query(contactUri, null, null, null, null); //查询联系人数据库,获得一个可用的Cursor if(c.moveToFirst()) { //将Cursor移动到第一条记录 String suspect = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); //通过Cursor c获得联系人名字 String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); //通过Cursor c获得联系人id Cursor c2 = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null); //在ContactsContract.CommonDataKinds.Phone.CONTENT_URI里, // 通过上面获得的联系人id获得一个新的Cursor c2 c2.moveToFirst(); String phonenum = c2.getString(c2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //通过Cursor c2获得联系人电话 mCrime.setSuspect(suspect); mCrime.setPhonenum(phonenum); mSuspectButton.setText(suspect + ":" + phonenum); c2.close(); //关闭Cursor c2 c.close(); //关闭Cursor c } } }
第四步、获取电话信息后,如需拨打电话则可以创建一个新的隐式Intent,以Intent.ACTION_DIAL为动作进行拨打电话,其中Uri.parse()辅助解析传入的字符串,
而电话号码格式为"tel:10086",tel为指定的协议。
<Uri number = Uri.parse("tel:" + mCrime.getPhoneNum()); Intent i = new Intent(Intent.ACTION_DIAL,number); //创建新的隐式Intent,拨打电话 startActivity(i);
相关文章推荐
- Exception raised during rendering: android/support/v4/widget/SwipeRefreshLayout : Unsupported major.
- Android之来电秀实现(二)
- Android之来电秀实现(二)
- 他们都没告诉你适配 Android N 需要注意什么
- Android进阶笔记17:ListView篇之ListView刷新显示(全局 和 局部)
- android的5种存储方式
- Android 使用mediaRecorder进行录音
- Android中 startService()和bindService()的区别
- android启动出错
- Android so文件是32位时,如何在64位手机上运行。
- Android开发性能优化大总结
- Android手机如何使用Fidder抓包
- android之标签icon在文本多行背后或首次位置显示
- 【Android SDK开发】各种Android Dialog创建及其监听事件实现
- Android Studio导入Android源码
- Android项目:手机安全卫士(10)—— 电话归属地显示
- 关于android的屏幕适配
- android只title背景色随着滚动渐变颜色
- Android悬浮窗的实现
- Android RecyclerView的使用