Android权限询问的实例详解

AndroidMaifest.xml中声明权限

<!-- 声明所有需要的权限(包括普通权限和危险权限) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>

直接上代码,放在想要拦截的地方即可 ,一般是程序启动时即访问

private static final int MY_PERMISSION_REQUEST_CODE = 10000;

//第 1 步: 检查是否有相应的权限,
boolean isAllGranted = checkPermissionAllGranted(
    new String[] {
        //根据自己需求,进行添加相应的权限
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    }
);
// 如果权限全都拥有, 则直接初始化日志文件
if (isAllGranted) {
    configureLog4J.configure();//有权限之后要做的事情
    return;
}

//第 2 步: 请求权限
// 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
ActivityCompat.requestPermissions(
    this,
    new String[] {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    },
    MY_PERMISSION_REQUEST_CODE
);

//检查是否拥有指定的所有权限
private boolean checkPermissionAllGranted(String[] permissions) {
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            // 只要有一个权限没有被授予, 则直接返回 false
            return false;
        }
    }
    return true;
}

//第 3 步: 申请权限结果返回处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == MY_PERMISSION_REQUEST_CODE) {
        boolean isAllGranted = true;

        // 判断是否所有的权限都已经授予了
        for (int grant : grantResults) {
            if (grant != PackageManager.PERMISSION_GRANTED) {
                isAllGranted = false;
                break;
            }
        }

        if (isAllGranted) {
            // 如果所有的权限都授予了, 则初始化日志文件
            configureLog4J.configure();//有权限之后要做的事情

        } else {
            // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
            openAppDetails();
        }
    }
}
//打开 APP 的详情设置
private void openAppDetails() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("该程序需要访问 “外部存储器”,请到 “应用信息 -> 权限” 中授予!");
    builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse("package:" + getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            startActivity(intent);
        }
    });
    builder.setNegativeButton("取消", null);
    builder.show();
}

到此这篇关于Android权限询问的文章就介绍到这了,更多相关Android权限询问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • android开发权限询问的示例代码

    现在基于信息安全问题,特别是版本是23以上权限越严格. 特别是拍照,读,写权限 一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者启动页直接询问,不允许的就用不了1.下面给出封装好的类,至于什么时候调看项目需要 public class EasyPermissions { private static final String TAG = "EasyPermissions"; public interface PermissionCallbacks extends Act

  • Android11文件管理权限申请详细介绍

    目录 Android 11文件管理权限申请 Android 11和低版本的存储权限结合 工具类封装 Android 11申请管理所有文件权限的Bug Android 11文件管理权限申请 Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDcard根目录写文件,Android 11之后要使用分区存储,但是分区存储使用起来很麻烦,所以可以申请文件管理权限,这样就可以随意读写SDcard了,写到根目录也没问题. 清单文件声明如下: <?xml ver

  • Android运行时权限终极方案(PermissionX)

    各位小伙伴们大家早上好,不知道你的<第三行代码>已经读到哪里了? 有些朋友的阅读速度真是令人印象深刻,我记得在<第三行代码>刚刚发售一周不到的时间里,竟然就有人已经读到第9章了(因为公众号后台有人回复第9章里隐藏的关键字).现在,<第三行代码>已经出版一个月有余了,相信已经有不少朋友将全本书都看完了. 全书都看完的朋友一定知道,<第三行代码>的最后一章是带着大家一起开发了一个开源库:PermissionX.这一章的主旨是为了让你了解一个开源库整体的开发与发布

  • Android申请相机权限和读写权限实例

    开发一个相机应用,需要申请三个权限:相机.读文件.写文件. 1.在AndroidManifest.xml中添加 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name

  • Android registerForActivityResult动态申请权限案例详解

    前言 这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线...这叫一个强迫症的我怎么受得了.赶紧网上找资料也找不出什么结果,看了官方文档才发现了有registerForActivityResult这么一个神奇好用的函数,可以代替我们现有的startActivityForResult和权限申请函数. 那么下面就分两种情况来讲一下如何使用这个函数动态申请权限. 一.申请单个权限 首先,我们需要定义一个launcher: Activity

  • Android权限询问的实例详解

    AndroidMaifest.xml中声明权限 <!-- 声明所有需要的权限(包括普通权限和危险权限) --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses

  • Android 中ContentProvider的实例详解

    Android 中ContentProvider的实例详解 Content Provider 的简单介绍: * Android中的Content Provider 机制可支持在多个应用中存储和读取数据.这也是跨应用 共享数据的唯一方式.在Android系统中,没有一个公共的内存区域,供多个应用共享存储数据: * Android 提供了一些主要数据类型的ContentProvider ,比如:音频.视频.图片和私人通讯录等: 在android.provider 包下面找到一些android提供的C

  • Android 判断网络状态实例详解

    Android 判断网络状态实例详解 实例代码 package com.example.android; import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.util.

  • Android 帧动画的实例详解

    Android 帧动画的实例详解 对于 Android 帧动画 大体上可以理解成 一张张图片 按一定顺序切换, 这样当连续几张图是一组动画时,就可以连起来了看成是一个小电影,你懂得 好得,比就装到这里,下面开始进入正题,由于产品需求 需要做一个 声音喇叭动态切换的样式,我特么第一就想到是帧动画切换,然后就百度了一些资料,发现 真的, 现在这个网上太多的资料是 copy粘贴过来的, 一错全错,对于这种情况我只想说,made,一群垃圾, 所以今天我将带你们走进Android 正确帧动画地址. 第一步

  • Android的搜索框架实例详解

    基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

  • Android Intent封装的实例详解

    Android Intent封装的实例详解 什么是Intent: Intent是协调应用间.组件之间的通讯和交互.通过Intent你可以启动Activity.Service.Broadcasts.更可以跨程序调用第三方组件.例如:启动拨打电话界面.音乐播放等. 组件     启动 Activity startActicity() Service startService(),bindService( ) Broadcasts sendBroadcast() 使用Intent: 栗子:在一个Act

  • Android 完全退出的实例详解

    Android 完全退出的实例详解 首先,在基类BaseActivity里,注册RxBus监听: public class BaseActivity extends AppCompatActivity { Subscription mSubscription; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Utils.intiSySBar(thi

  • Android 中 ActivityLifecycleCallbacks的实例详解

    Android 中 ActivityLifecycleCallbacks的实例详解           以上就是使用ActivityLifecycleCallbacks的实例,代码注释写的很清楚大家可以参考下, MyApplication如下: package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bun

  • Android全局获取Context实例详解

    Android全局获取Context实例详解 在弹出Toast 启动活动 发送广播 操作数据库 使用通知等等时都需要Context 如果操作在活动中进行是很简单的,因为活动本身就是一个Context对象 但是当逻辑代码脱离了Activity类,此时使用Context就需要一些技巧了: 我们可以定制一个自己的Application类,以便管理程序内一些全局状态信息,比如全局Context 代码如下: public class MyApplication extends Application{ p

  • Android IPC机制Messenger实例详解

    Android IPC机制Messenger实例详解 前言: Messenger可以翻译成信使,通过它可以在不同进程间传递Message对象有了它就可以轻松实现进程间的数据传递了. Messenger使用的方法相对AIDL比较简单,它对AIDL做了一层封装是的我们不需要像采用AIDL那样去实现进程通信那么麻烦,可以看看他的源码有AIDL的迹象. public final class Messenger implements Parcelable { private final IMessenge

随机推荐