Android实现获取联系人电话号码功能
程序员文章站
2023-12-03 23:24:04
本篇文档主要记录一下获取联系人的电话号码的一种方式。
1、选择联系人
............
//构造一个隐式的intent,拉起联系人界面
final...
本篇文档主要记录一下获取联系人的电话号码的一种方式。
1、选择联系人
............ //构造一个隐式的intent,拉起联系人界面 final intent pickintent = new intent(intent.action_pick, contactscontract.contacts.content_uri); msuspectbutton = (button)v.findviewbyid(r.id.crime_suspect); msuspectbutton.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { startactivityforresult(pickintent, request_contact); } }); ...........
2、处理选择结果
@override public void onactivityresult(int requestcode, int resultcode, intent data) { ........... } else if (requestcode == request_contact && data != null) { //在联系人界面选择完毕后,返回的结果中携带了对应的uri uri contacturi = data.getdata(); string[] queryfields = new string[] { contactscontract.contacts.display_name, //查询联系人对应的contactid contactscontract.contacts._id }; cursor c = getactivity().getcontentresolver() .query(contacturi, queryfields, null, null, null); if (c == null) { return; } try { if (c.getcount() == 0) { return; } c.movetofirst(); //联系人的名称 string suspect = c.getstring(0); mcrime.setsuspect(suspect); msuspectbutton.settext(suspect); //记录联系人的contactid mcrime.setcontactid(c.getstring(1)); mdialbutton.setenabled(true); } finally { c.close(); } } }
3、申请运行时权限
在android6.0以后,read_contacts变为运行时权限。
因此,除了在androidmanifest.xml中声明权限外(兼容低版本),还需要在代码中主动申请。
............... mdialbutton = (button) v.findviewbyid(r.id.crime_dial); mdialbutton.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //sdk >= 23时,定义了activity.checkselfpermission方法 //为了避免对sdk版本的判断,兼容低版本,一般都是使用兼容库中的方法 //此处使用的是android.support.v4.app.fragment中的checkselfpermission //对于activity,可以使用activitycompat中的方法 int hasreadcontactspermission = checkselfpermission(getcontext(), android.manifest.permission.read_contacts); //判断是否已有对应权限 //用户主动赋予过一次后,该应用就一直具有该权限,除非在应用管理中撤销 if (hasreadcontactspermission != packagemanager.permission_granted) { //没有权限,则需要申请权限 //当用户选择“拒绝权限申请,并不再提示”后,仍可能点击该按键 //因此需要弹出提示框,提醒用户该功能需要权限 //这就要用到shouldshowrequestpermissionrationale方法 if (!shouldshowrequestpermissionrationale(android.manifest.permission.read_contacts)) { showmessageokcancel("you need to allow access to contacts", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { //仍调用兼容库中的方法,申请权限 requestpermissions( new string[] {manifest.permission.read_contacts}, ask_read_contacts_permission); } }); return; } requestpermissions(new string[] {manifest.permission.read_contacts}, ask_read_contacts_permission); return; } //有权限则直接获取电话号码,并拨号 getphonenumberanddial(); } }); ................ private void showmessageokcancel(string message, dialoginterface.onclicklistener oklistener) { new alertdialog.builder(getcontext()) .setmessage(message) .setpositivebutton("ok", oklistener) .setnegativebutton("cancel", null) .create() .show(); }
4、处理权限申请结果
@override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) { switch (requestcode) { case ask_read_contacts_permission: //由于只申请了一个权限,因此grantresults[0]就是对应权限的申请结果 if (grantresults[0] == packagemanager.permission_granted) { //权限申请成功,则可以获取电话号码并拨号 getphonenumberanddial(); } else { toast.maketext(getcontext(), "read_contacts denied", toast.length_short) .show(); } return; default: super.onrequestpermissionsresult(requestcode, permissions, grantresults); } }
这个地方需要注意的是:
1)、如果不使用兼容库中的fragment,那么onrequestpermissionsresult必须定义在包含该fragment的activity中,才能保证被调用。
2)、如果用户点击过“拒绝权限申请,并不再提示”类似的按键后,再次申请权限的结果将一直是denied。
此时,必须进入设置中的应用管理,开启运行时权限。
5、查询电话号码并拨号
private void getphonenumberanddial() { //根据之前获取到的contactid,得到commondatakinds.phone表中的信息 cursor c = getactivity().getcontentresolver().query( contactscontract.commondatakinds.phone.content_uri, null, contactscontract.commondatakinds.phone.contact_id + " = ?", new string[] {mcrime.getcontactid()}, null); if (c == null) { return; } try { if (c.getcount() != 0) { c.movetofirst(); //得到phone number对应的indexid int index = c.getcolumnindex(contactscontract.commondatakinds.phone.number); //得到phone number string number = c.getstring(index); uri realnumber = uri.parse("tel: " + number); //action_dial拉起拨号盘拨号,或利用action_call直接拨号 intent i = new intent(intent.action_dial); i.setdata(realnumber); startactivity(i); } else { toast.maketext(getcontext(), "choose contact again", toast.length_long).show(); } } finally { c.close(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 发糕的做法有哪些,这么做松软可口!
下一篇: Android自定义控件实现万能的对话框