首页 > 其他分享 >基础复习——运行时动态申请权限——重点

基础复习——运行时动态申请权限——重点

时间:2022-08-21 15:57:09浏览次数:47  
标签:btn 复习 class else Intent 权限 id 动态

 

 

 

App涉及到硬件设备的操作,比如拍照、录音、定位、SD卡等等,都要在AndroidManifest.xml中声明相关的权限。

 


可是Android系统为了防止某些App滥用权限,又允许用户在系统设置里面对App禁用某些权限。

 


但这又带来另一个问题,用户打开App之后,App可能因为权限不足导致无法正常运行,甚至直接崩溃闪退。

 


有鉴于此,Android从6.0开始引入了运行时权限管理机制,允许App在运行过程中动态检查是否拥有某项权限,一旦发现缺少某种必需的权限,则系统会自动弹出小窗提示用户去开启该权限。

 

 

 

 

 

 

 

 

 

 

 

 

(1)检查App是否开启了指定权限


调用ContextCompat的checkSelfPermission方法。

 

 

 


(2)请求系统弹窗,以便用户选择是否开启权限


调用ActivityCompat的requestPermissions方法,即可命令系统自动弹出权限申请窗口。

 

 

 


(3)判断用户的权限选择结果


重写活动页面的权限请求回调方法onRequestPermissionsResult,在该方法内部处理用户的权限选择结果。

 

 

 

 

 

 

 

 

 

 

 

权限:

 

    <!-- 存储卡读写 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- Android10新增权限MANAGE_EXTERNAL_STORAGE -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <!-- 联系人/通讯录。包括读联系人、写联系人 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <!-- 短信。包括发送短信、接收短信、读短信 -->
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <!-- 通话记录。包括读通话记录、写通话记录 -->
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <!-- 安装应用请求,Android8.0需要 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!-- 获取媒体位置(Android10新增权限) -->
    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PermissionUtil

 

package com.example.myapplication.util;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class PermissionUtil
{
    private final static String TAG = "PermissionUtil";

    // 检查某个权限。返回true表示已启用该权限,返回false表示未启用该权限
    public static boolean checkPermission(Activity act, String permission, int requestCode)
    {

        return checkPermission(act, new String[]{permission}, requestCode);
    }

    // 检查多个权限。返回true表示已完全启用权限,返回false表示未完全启用权限
    public static boolean checkPermission(Activity act, String[] permissions, int requestCode)
    {
        boolean result = true;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            int check = PackageManager.PERMISSION_GRANTED;

            // 通过权限数组检查是否都开启了这些权限
            for (String permission : permissions)
            {
                check = ContextCompat.checkSelfPermission(act, permission);

                if (check != PackageManager.PERMISSION_GRANTED)
                {
                    break; // 有个权限没有开启,就跳出循环
                }
            }

            if (check != PackageManager.PERMISSION_GRANTED)
            {
                // 未开启该权限,则请求系统弹窗,好让用户选择是否立即开启权限
                ActivityCompat.requestPermissions(act, permissions, requestCode);

                result = false;
            }
        }

        return result;

 


 

    }

    // 检查权限结果数组,返回true表示都已经获得授权。返回false表示至少有一个未获得授权
    public static boolean checkGrant(int[] grantResults)
    {
        boolean result = true;

        if (grantResults != null)
        {
            for (int grant : grantResults)  // 遍历权限结果数组中的每条选择结果
            {
                if (grant != PackageManager.PERMISSION_GRANTED) { // 未获得授权
                    result = false;
                }
            }

        }
        else
        {

            result = false;
        }

        return result;
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

权限校验:

 

package com.example.myapplication;

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.myapplication.util.PermissionUtil;

public class MainActivity extends AppCompatActivity implements View.OnClickListener
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_next1).setOnClickListener(this);
        findViewById(R.id.btn_next2).setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {

        if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_next1 % 65536))
        {
            startActivity(new Intent(this, ContentWriteActivity.class));
        }
        else
        {
            Toast.makeText(this, "需要允许存储卡权限噢", Toast.LENGTH_SHORT).show();
        }

        if (v.getId() == R.id.btn_next2)
        {
            startActivity(new Intent(this, ContentReadActivity.class));  //创建一个目标确定的意图

        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:gravity="center"
                android:text="7.1 在应用之间共享数据" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_content_write"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="写入共享内容" />

                <Button
                    android:id="@+id/btn_content_read"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="读取共享内容" />

            </LinearLayout>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:gravity="center"
                android:text="7.2 获取通讯信息" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_file_write"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="公共空间写入文本文件" />

                <Button
                    android:id="@+id/btn_file_read"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="公共空间读取文本文件" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_contact_add"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="添加联系人" />

                <Button
                    android:id="@+id/btn_contact_read"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="读取联系人" />

                <Button
                    android:id="@+id/btn_monitor_sms"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="流量校准" />

            </LinearLayout>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:gravity="center"
                android:text="7.3 在应用之间共享文件" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_send_mms"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="发送彩信(通过系统相册)" />

                <Button
                    android:id="@+id/btn_provider_mms"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="发送彩信(Provider方式)" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_provider_apk"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="安装应用" />

            </LinearLayout>

        </LinearLayout>
    </ScrollView>

</LinearLayout>

 

package com.example.chapter07;

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter07.util.PermissionUtil;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_content_write).setOnClickListener(this);
        findViewById(R.id.btn_content_read).setOnClickListener(this);
        findViewById(R.id.btn_file_write).setOnClickListener(this);
        findViewById(R.id.btn_file_read).setOnClickListener(this);
        findViewById(R.id.btn_contact_add).setOnClickListener(this);
        findViewById(R.id.btn_contact_read).setOnClickListener(this);
        findViewById(R.id.btn_monitor_sms).setOnClickListener(this);
        findViewById(R.id.btn_send_mms).setOnClickListener(this);
        findViewById(R.id.btn_provider_mms).setOnClickListener(this);
        findViewById(R.id.btn_provider_apk).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_content_write) {
            Intent intent = new Intent(this, ContentWriteActivity.class);
            startActivity(intent);
        } else if (v.getId() == R.id.btn_content_read) {
            Intent intent = new Intent(this, ContentReadActivity.class);
            startActivity(intent);
        } else if (v.getId() == R.id.btn_file_write) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_file_write % 65536)) {
                startActivity(new Intent(this, FileWriteActivity.class));
            }
        } else if (v.getId() == R.id.btn_file_read) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_file_read % 65536)) {
                startActivity(new Intent(this, FileReadActivity.class));
            }
        } else if (v.getId() == R.id.btn_contact_add) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_CONTACTS, R.id.btn_contact_add % 65536)) {
                startActivity(new Intent(this, ContactAddActivity.class));
            }
        } else if (v.getId() == R.id.btn_contact_read) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.READ_CONTACTS, R.id.btn_contact_read % 65536)) {
                startActivity(new Intent(this, ContactReadActivity.class));
            }
        } else if (v.getId() == R.id.btn_monitor_sms) {
            if (PermissionUtil.checkPermission(this, new String[] {Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS}, R.id.btn_monitor_sms % 65536)) {
                startActivity(new Intent(this, MonitorSmsActivity.class));
            }
        } else if (v.getId() == R.id.btn_send_mms) {
            Intent intent = new Intent(this, SendMmsActivity.class);
            startActivity(intent);
        } else if (v.getId() == R.id.btn_provider_mms) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_provider_mms % 65536)) {
                startActivity(new Intent(this, ProviderMmsActivity.class));
            }
        } else if (v.getId() == R.id.btn_provider_apk) {
            if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_provider_apk % 65536)) {
                startActivity(new Intent(this, ProviderApkActivity.class));
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // requestCode不能为负数,也不能大于2的16次方即65536
        if (requestCode == R.id.btn_file_write % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, FileWriteActivity.class));
            } else {
                //ToastUtil.show(this, "需要允许存储卡权限才能写入公共空间噢");
                Toast.makeText(this, "需要允许存储卡权限才能写入公共空间噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_file_read % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, FileReadActivity.class));
            } else {
                Toast.makeText(this, "需要允许存储卡权限才能读取公共空间噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_contact_add % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, ContactAddActivity.class));
            } else {
                Toast.makeText(this, "需要允许通讯录权限才能读写联系人噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_contact_read % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, ContactReadActivity.class));
            } else {
                Toast.makeText(this, "需要允许通讯录权限才能读写联系人噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_monitor_sms % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, MonitorSmsActivity.class));
            } else {
                Toast.makeText(this, "需要允许短信权限才能校准流量噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_provider_mms % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, ProviderMmsActivity.class));
            } else {
                Toast.makeText(this, "需要允许存储卡权限才能发送彩信噢", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == R.id.btn_provider_apk % 65536) {
            if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权
                startActivity(new Intent(this, ProviderApkActivity.class));
            } else {
                Toast.makeText(this, "需要允许存储卡权限才能安装应用噢", Toast.LENGTH_SHORT).show();
            }
        }
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:btn,复习,class,else,Intent,权限,id,动态
From: https://www.cnblogs.com/xiaobaibailongma/p/16610115.html

相关文章

  • 阿里云服务器ECS安装MySQL数据库、初始化密码修改,远程访问权限设置、开放服务器3306端
    1.修改配置文件/etc/my.cnf,在[mysqld]下面添加一行代码:skip-grant-tables2.servicemysqldrestart3.mysql-uroot-p //此时直接回车,既可以进入数据库。4.进数据库后......
  • 提高动态响应之下垂控制Droop分析
    最近开始工作啦,思考很久,还是保留经常记录的习惯吧!为了不辜负粉丝的信任,我得写详细点。 今天分享一种工业上常用改善动态响应的控制方法。一、原理当电源负载......
  • JavaScript使用reduce动态修改对象的属性名
      首先在添加到数组的时候,弄2个,把number冒号右边的是可以动态修改的,后面再使用reduce合并;    countryChildrenDouble的数据     合并之后twoO......
  • 动态规划——摘花生
    原题HelloKitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面......
  • 基础复习——利用Room简化数据库操作——重点
       使用数据库帮助器编码的时候,开发者每次都得手工实现以下代码逻辑:(1)重写数据库帮助器的onCreate方法,添加该表的建表语句;(2)在插入记录之时,必须将数据实例的属性值逐......
  • 动态规划之——01背包问题
    动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。 ——引用于百度百科我们先从一个例子看下动态规划的思想。有一个最大负重为8千克的背......
  • mybats动态sql
    动态SQL根据特定条件动态拼装SQL的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点IF标签根据标签中test属性所对应的表达式来决定标签中的内容,是否拼接到语句中......
  • 基础复习——数据库SQLite——SQL的基本语法——数据库管理器SQLiteDatabase——数据
                                                         ......
  • postgresql用户与权限管理
    pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合。为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的......
  • linux 上特殊的权限位
    通常我们文件一般三种权限名称:读、写、执行标识:r、w、x二进制:4、2、1特殊权限也有三种名称:setuid、setgid、粘连位标识:s、s、t二进制:4、2、1setuid场......