Android 6.0及以上运行时权限申请教程:拨打电话为例
"Android在程序运行时申请权限的实例讲解" 在Android开发中,自Android 6.0(API级别23)引入了运行时权限的概念,与之前版本不同,应用不再在安装时自动获得所有权限,而是需要在运行时根据用户的需求请求权限。这一改变提升了用户对应用权限使用的控制,同时也对开发者提出了新的挑战。本文将通过一个拨打电话的实例,详细介绍如何在Android程序运行时申请权限。 首先,我们需要了解Android权限的分类:普通权限和危险权限。普通权限通常不会对用户隐私造成威胁,系统会在安装时自动授予;而危险权限涉及到用户的敏感数据或功能,如访问联系人、发送短信、拨打电话等,这些都需要在运行时由用户进行明确的同意。 在AndroidManifest.xml文件中,我们需要声明所需的权限,例如拨打电话的权限: ```xml <uses-permission android:name="android.permission.CALL_PHONE" /> ``` 尽管在清单文件中声明了权限,但如前所述,对于危险权限,我们还需要在运行时检查并请求。以下是如何在MainActivity中实现这个功能: ```java public class MainActivity extends AppCompatActivity { private static final int REQUEST_CALL_PERMISSION = 1; private Button makeCallButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); makeCallButton = findViewById(R.id.make_call); makeCallButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // 检查是否已经有了拨打电话的权限,如果没有,请求权限 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CALL_PERMISSION); } else { // 已经有拨打电话的权限,可以直接执行拨打电话的逻辑 callPhone(); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case REQUEST_CALL_PERMISSION: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意了权限请求,可以执行拨打电话的逻辑 callPhone(); } else { // 用户拒绝了权限请求,可以根据需求处理,如显示提示信息 Toast.makeText(this, "Permission denied to make calls", Toast.LENGTH_SHORT).show(); } return; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } private void callPhone() { Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:1234567890")); // 替换为实际电话号码 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { startActivity(callIntent); } else { // 如果没有拨打电话的权限,不应该执行此操作 Toast.makeText(this, "Permission needed to make calls", Toast.LENGTH_SHORT).show(); } } } ``` 在上述代码中,我们首先在`onCreate`方法中初始化按钮,并设置点击监听器。当点击按钮时,会检查是否有拨打电话的权限。如果没有,通过`ActivityCompat.requestPermissions()`方法向用户请求权限,同时指定请求码`REQUEST_CALL_PERMISSION`。在`onRequestPermissionsResult`回调中,我们根据用户的选择决定是否执行拨打电话的逻辑。 通过这样的方式,我们可以确保在用户允许的情况下使用危险权限,遵循了Android 6.0及更高版本的权限管理机制。这种做法提高了应用的透明度,增强了用户对隐私的保护。在实际开发中,针对不同的权限需求,开发者需要按照相同的方式处理,以确保应用的正常运行和用户满意度。
下载后可阅读完整内容,剩余5页未读,立即下载
- 粉丝: 0
- 资源: 891
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展