IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 运行时权限-动态申请 -> 正文阅读

[移动开发]运行时权限-动态申请

运行时权限

运行时权限也称为危险权限,此类权限授予应用对受限数据的额外访问权限,并允许应用执行对系统和其他应用具有更严重影响的受限操作。因此,您需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。当应用请求运行时权限时,系统会显示运行时权限提示。

在Android官方网站中可以找到运行时权限,系统会为运行时权限分配“dangerous”保护级别

https://developer.android.com/reference/android/Manifest.permission

许多运行时权限会访问私有用户数据,这是一种特殊的受限数据,其中包含可能比较敏感的信息。例如,位置信息和联系信息就属于私有用户数。

权限动态申请

request runtime permission,新建一个RequestContacts项目,用于读取联系人。

1. 首先在联系人中随意添加几个姓名及其电话

2. 在activity_main.xml文件中新建一个ListView用于显示读取到的联系人

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_contacts"
        />

</LinearLayout>

3. 在MainActivity.java中加入如下代码:

实现显示联系人的逻辑:

public class MainActivity extends AppCompatActivity {

    private ArrayAdapter<String> adapter;
    private ListView contactView;
    private List<String> contactList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        contactView = findViewById(R.id.list_contacts);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, contactList);
        contactView.setAdapter(adapter);
    }
}

实现动态申请权限的逻辑:

检查是否有相应的权限需要调用 ContextCompat.checkSelfPermission()?方法,该方法接收两个参数,第一个是Context,第二是具体的权限名。根据应用是否具有相应权限,此方法会返回?PERMISSION_GRANTED?或?PERMISSION_DENIED?。

requestPermissions() 则用于申请权限。
ActivityCompat.requestPermissions()?和Activity.requestPermissions()的参数略有区别。ActivityCompat.requestPermissions()接收三个参数,第一个是Activity的实例;第二个是要申请的所有权限,以数组方式传入;第三个是requestCode申请码,需要是从0开始的唯一整数值。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ...
        // request app runtime permission
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
                == PackageManager.PERMISSION_GRANTED) {
            readContacts();
        } else {
            requestPermissions(new String[]{ Manifest.permission.READ_CONTACTS }, 1);
        }
    }
}

调用了完requestPermissions()之后,系统会弹出一个权限申请的对话框,用户可以选择或者拒绝权限申请,无论结果如何,都会回调onRequestPermissionsResult()方法,重写该方法,用于处理用户的不同选择。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (grantResults == null || grantResults.length == 0) {return;}
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    readContacts();
                } else {
                    Log.d(PKG + TAG, "onRequestPermissionsResult: You Denied the Permission");
                    Toast.makeText(this, "You Denied the Permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

然后处理读取联系人的逻辑。代码如下:

    private void readContacts() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.
                    Phone.CONTENT_URI, null, null, null, null);
            if (null != cursor) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndexOrThrow(
                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String phoneNumber = cursor.getString(cursor.getColumnIndexOrThrow(
                            ContactsContract.CommonDataKinds.Phone.NUMBER));
                    contactList.add(name + ": " + phoneNumber);
                }
                adapter.notifyDataSetChanged();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != cursor) {cursor.close();};
        }
    }

最后,别忘了即使是动态申请权限也需要在AndroidManifest.xml文件中加入相关权限声明。

<uses-permission android:name="android.permission.READ_CONTACTS" />

运行程序,

点击Deny

点击Allow

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:40:09  更:2022-07-21 21:40:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 3:51:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码