我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android studio开发——android11版本以上权限动态申请问题,包括文件读写、图片、相机的调用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

android studio开发——android11版本以上权限动态申请问题,包括文件读写、图片、相机的调用

用于android手机的升级,现在已经是android13版本了,对于权限问题可能更加敏感了,前段时间开发发现之前的方法已经不再适用于android11以后的版本了

读写权限申请最好是跳转到设置中进行才是最好了,下面我们开始进行

首先是AndroidManifest.xml文件的权限

                                                

然后这里讲解一下权限申请的情况,有两种情况

第一种情况是直接在Activity中申请权限

第二种情况是在Fragment中申请权限

第一种情况就比较直接,按照android11之前的权限申请如下

//首先定义请求变量  private static final String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};//请求状态码,请求码的作用是与回调函数进行匹配的,这样就可以对不同权限操作进行不同的提示private static final int REQUEST_EXTERNAL_STORAGE = 1;//使用ActivityCompat.requestPermissions进行动态权限申请ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);//然后Activity会有一个回调函数,可以在这个回调函数做一些提示//如下重写onRequestPermissionsResult方法@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //申请文件读写权限        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_EXTERNAL_STORAGE:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    havePermission = true;                    Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                } else {                    havePermission = false;                    Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();                }                break;            case REQUEST_PERMISSION_CODE_33:                Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                break;        }

 完整代码例子如下

public class MainActivity extends AppCompatActivity {     private static final String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};    //请求状态码    private static final int REQUEST_EXTERNAL_STORAGE = 1;    //创建Activity生命周期    protected void onCreate(Bundle savedInstanceState) {    }    //获取Activity焦点的生命周期    @Override    protected void onResume() {        super.onResume();        checkPermission();    }     private AlertDialog dialog;    private void checkPermission() {        //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权            //这里是android7以上就需要动态申请权限            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {                    //申请权限                    if (dialog != null) {                        dialog.dismiss();                        dialog = null;                    }                    dialog = new AlertDialog.Builder(this).setTitle("提示")//设置标题.setMessage("请开启文件访问权限,否则无法正常使用应用!").setPositiveButton("确定", new DialogInterface.OnClickListener() {    @Override    public void onClick(DialogInterface dialog, int which) {        dialog.dismiss();        ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);    }}).create();                    dialog.show();                } else {                    havePermission = true;        }            } else {                //android6以下不需要动态申请权限                havePermission = true;}            }}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //申请文件读写权限        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_EXTERNAL_STORAGE:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    havePermission = true;                    Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                } else {                    havePermission = false;                    Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();                }                break;            case REQUEST_PERMISSION_CODE_33:                Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                break;        }

 下面是第二种情况在Fragment中动态申请权限,因为Fragment是相当于依附在Activity中的页面,所以Fragment中没有回调函数处理,因此需要用到它所在的Activity的activity对象,例如Fragment的定义如下

public class PersonFragment extends Fragment {    //定义一个Activity对象,用于给MainActivity赋值    public static Activity context;    private static final String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA};    //请求状态码    private static final int REQUEST_EXTERNAL_STORAGE = 1;} @Override public void onStart() {     super.onStart();        checkPermission();    }     private AlertDialog dialog;    private void checkPermission() {        //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权            //这里是android7以上就需要动态申请权限            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {                    //申请权限                    if (dialog != null) {                        dialog.dismiss();                        dialog = null;                    }                    dialog = new AlertDialog.Builder(this).setTitle("提示")//设置标题.setMessage("请开启文件访问权限,否则无法正常使用应用!").setPositiveButton("确定", new DialogInterface.OnClickListener() {    @Override    public void onClick(DialogInterface dialog, int which) {        dialog.dismiss();        ActivityCompat.requestPermissions(context, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);    }}).create();                    dialog.show();                } else {                    havePermission = true;        }            } else {                //android6以下不需要动态申请权限                havePermission = true;}            }

那么在MainActivity中我们给上面的Fragment赋值activity对象,那么Fragment就可以在申请权限的时候操做MainActivity的回调函数了,MainActivity代码例子如下

public class MainActivity extends AppCompatActivity {    //这里的请求码要和Fragment的请求码一致    private static final int REQUEST_EXTERNAL_STORAGE = 1;    //创建Activity生命周期    protected void onCreate(Bundle savedInstanceState) {        PersonFragment.context = MainActivity.this    }@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //申请文件读写权限        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_EXTERNAL_STORAGE:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    havePermission = true;                    Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                } else {                    havePermission = false;                    Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();                }                break;            case REQUEST_PERMISSION_CODE_33:                Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                break;        }

以上例子是对于一些到懂不懂的朋友讲解权限申请与回调函数的关系使用,下面就是android7以下及android11以下以及android13以下的动态权限申请情况

文件读写权限直接上代码了

public class MainActivity extends AppCompatActivity {     //申请的权限放进数组里     private static final String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};    //请求状态码    private static final int REQUEST_EXTERNAL_STORAGE = 1;    //创建Activity生命周期    protected void onCreate(Bundle savedInstanceState) {    }    //获取Activity焦点的生命周期       @Override    protected void onResume() {        super.onResume();        checkPermission();    }    private AlertDialog dialog;    private void checkPermission() {        //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权        //这里是android11以上的读写权限申请        //需要通过Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION跳转到权限设置打开权限        if (Build.VERSION.SDK_INT >= 30) {            if (!Environment.isExternalStorageManager()) {                if (dialog != null) {                    dialog.dismiss();                    dialog = null;                }                dialog = new AlertDialog.Builder(this)                        .setTitle("提示")//设置标题                        .setMessage("请开启文件访问权限,否则无法正常使用本应用!")                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int i) {    dialog.dismiss();}                        })                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {    dialog.dismiss();    Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);    startActivity(intent);}                        }).create();                dialog.show();            } else {                havePermission = true;}        } else {            //这里就是android7到android11的权限申请            //直接通过ActivityCompat.requestPermissions就可以            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {                    //申请权限                    if (dialog != null) {                        dialog.dismiss();                        dialog = null;                    }                    dialog = new AlertDialog.Builder(this).setTitle("提示")//设置标题.setMessage("请开启文件访问权限,否则无法正常使用应用!").setPositiveButton("确定", new DialogInterface.OnClickListener() {    @Override    public void onClick(DialogInterface dialog, int which) {        dialog.dismiss();        ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);    }}).create();                    dialog.show();                } else {                    havePermission = true;      }            } else {                //android7以下的不需要动态申请权限                havePermission = true;                           }        }    }    //权限申请成功后的回调函数,可以做提示或其他    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //申请文件读写权限        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_EXTERNAL_STORAGE:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    havePermission = true;                    Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                } else {                    havePermission = false;                    Toast.makeText(this, "授权被拒绝!", Toast.LENGTH_SHORT).show();                }                break;            case REQUEST_PERMISSION_CODE_33:                Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();                break;        }    }

相册、相机权限申请情况

这里可能就android13比较特殊,因为android13把相册分成了3个权限,分别是图片申请、视频申请、音频申请

private static final String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};//请求状态码private static final int REQUEST_EXTERNAL_STORAGE = 1;//android13相册权限申请变量    private static final String[] PERMISSIONS_STORAGE_33 = {Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.CAMERA};//请求状态码private static final int REQUEST_PERMISSION_CODE_33 = 2;

那么权限数组可能就不一样了,android13以下的申请读写权限就好了,而android13则可能需要动态申请这3个权限,所以代码如下,这里我用Fragment申请权限

@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)@SuppressLint("StaticFieldLeak")public class PersonFragment extends Fragment {    //MainActivity的activity对象    public static Activity context;      @Override    public void onStart() {        super.onStart();        ifHaveAlbumPermission(context)    }        //打开相册    private void openFile() {        Intent intentFromGallery = new Intent();        // 设置文件类型        intentFromGallery.setType("image/*");//选择图片        intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);                //你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方法调用MainActivity的回调函数        context.startActivityForResult(intentFromGallery, REQUEST_PICTURE_CODE);    }    // 判断是否有文件存储权限    private void ifHaveAlbumPermission(Activity activity) {        if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_MEDIA_IMAGES) != PackageManager.PERMISSION_GRANTED) {            //android13权限申请            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE_33, REQUEST_PERMISSION_CODE_33);                openFile();            } else {                //android13以下的权限申请                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);            }        } else {            openFile();        }           }}

以上就差不多完成了,相机的情况大同小异,可以看其他博主写的

来源地址:https://blog.csdn.net/m0_59799878/article/details/130795891

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android studio开发——android11版本以上权限动态申请问题,包括文件读写、图片、相机的调用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录