电话相关的Intent操作通常有两种:Intent.ACTION_DIAL和Intent.ACTION_CALL。ACTION_CALL直接调用手机应用并拨打来自Intent的电话号码;而ACTION_DIAL则拨号电话,然后等用户发起通话。使用ACTION_CALL必须声明权限,ACTION_DIAL不需要声明权限。
自己实现的功能是在Fragment中使用隐式Intent打开手机联系人应用,并获取到上一步选择的联系人号码,呼叫联系人的功能。参考第一行代码的相关部分,由于第一行代码中是在活动中设置运行时权限,所以不能直接用。网上百度得到的解决方案是:不要使用ActivityCompat.requestPermissions(...) 而是使用Fragment.requestPermissions(...),改了之后还是报错,因为Fragement中this使用错误,这时声明全局变量private Context mContext;
private Context mContext;
并且在Fragment的onCreate()方法中进行赋值
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = getActivity();在Fragment控件的匿名内部类中使用的声明权限方法为:
mCallButton = (Button) v.findViewById(R.id.case_call); mCallButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ requestPermissions(new String[]{ Manifest.permission.READ_CONTACTS }, 1); }else{ callContact(); } } });其中还遇到permission报错,原因是导错包,正确的导包应该是
import android.Manifest;callContact()方法是使用隐式Intent获取联系人电话号码并且拨号。获取联系人号码使用的是内容提供器。
private void callContact(){ Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; Cursor c = getActivity().getContentResolver().query(contactUri, null, null, null, null); try{ if(c.getCount() == 0){ return; } c.moveToFirst(); String contactId = c.getString(c.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); Intent callContact = new Intent(Intent.ACTION_DIAL); callContact.setData(Uri.parse("tel:" + contactId));startActivity(callContact); }finally { c.close(); } }其中回调的onRequestPermissionsResult(...)方法为:
@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){ callContact(); }else{ Toast.makeText(mContext,"You denied the permission", Toast.LENGTH_SHORT).show(); } } }
Manifest.xml文件中的声明权限为:
<uses-permission android:name="android.permission.READ_CONTACTS"/>综上所述,终于解决了今天困扰好久的问题,希望它对你能有所帮助。