在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"/>综上所述,终于解决了今天困扰好久的问题,希望它对你能有所帮助。
阅读全文
0 0
- 在Fragment控件的匿名内部类中使用运行时权限及相关问题
- 匿名内部类中this的使用问题
- 内部类及匿名内部类的使用实例
- 内部类的编码及使用,包括成员内部类,局部内部类,匿名内部类
- java中匿名内部类的问题
- JAVA中内部类和匿名内部类的区别,分别在什么时候使用它们?
- java中匿名内部类的使用
- 内部类、匿名内部类的使用
- 在Java中怎么定义一个匿名内部类,定义匿名内部类的条件是什么?
- 匿名内部类的使用
- 匿名内部类的使用
- 匿名内部类的使用
- 匿名内部类的使用
- 匿名内部类的使用
- 匿名内部类的使用
- JAVA中对同一问题分别使用内部类与匿名内部类实现
- 匿名内部类使用final参数的问题
- 匿名内部类使用final参数的问题(…
- Android Notification 总结
- android 五大布局(2)帧布局和表格布局
- window.location.hash
- 2017-10-19校内训练题题解
- 九度OJ——1447最短路
- 在Fragment控件的匿名内部类中使用运行时权限及相关问题
- struts2配置全局的结果集和包之间的继承
- 【51Nod1295】XOR key
- AngularJs多选框点击确认按钮弹出对应的值
- TCP/IP详解--TCP连接中TIME_WAIT状态过多
- linux学习笔记(3)
- opencv-python(14):图像金字塔
- 算法-希尔排序
- Python学习笔记3—程序的控制结构