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

本文探讨在Fragment控件内如何处理运行时权限,特别是在使用Intent与电话功能交互时的问题。涉及到ACTION_DIAL和ACTION_CALL的区别,以及在请求权限时遇到的错误和解决方案,包括在Fragment中正确请求权限的方法以及在Manifest.xml中声明权限的重要性。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值