在Fragment控件的匿名内部类中使用运行时权限及相关问题

来源:互联网 发布:网络被动攻击 编辑:程序博客网 时间:2024/06/07 21:05

电话相关的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()方法中进行赋值

@Overridepublic 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(...)方法为:

@Overridepublic 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"/>
综上所述,终于解决了今天困扰好久的问题,希望它对你能有所帮助。


原创粉丝点击