安卓10 Android Q 权限申请遇到的坑——更严格的动态权限申请和存储权限

安卓10 Android Q 权限申请遇到的坑——更严格的动态权限申请和存储权限

问题描述

本人刚入安卓app开发的大门,安卓10的权限问题就把我拒之门外。
我使用了File类的makedir()和createnewfile()方法,还有短信收发权限。首先我在Manifest里申请了权限(这可以肯定),在我的安卓6.0上完美运行,创建了log文件和所需文件夹,还有短信的收发。然而到了安卓10测试机上却费了一番周折,操作总是失败。
主要原因是新版本的安卓在权限管理上更加严格,开发者无法在安卓其他目录拥有较多的权限,所以一般的开发时都将文件放在外置存储的cache下。也就是手机内置存储中占用极大的Android/data文件夹。

原因介绍

这里参考了_YoungMan的原创文章:
文章网址:https://blog.csdn.net/qq_37199105/article/details/89632476

Android Q 中删除了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE两项危险权限,限制 App 只能使用自己的应用空间存放文件。

当 App 需要保存一些不能随卸载删除的文件时,需要根据存放位置动态申请新增的权限:READ_MEDIA_IMAGES,READ_MEDIA_VIDEO 或 READ_MEDIA_AUDIO(分别对应系统的媒体文件夹)。 比较特殊的是 Downloads 文件夹:写入和读取自身写入的数据不需要申请权限,但想获取其他 App 存进去的文件时,必须使用系统的文件选择器,由用户选择。

新建文件的方法

当然,在这之前还需要在manifest里加入读写权限并动态申请啦!不过据说在自己应用的缓存文件夹下的读写不需要外加权限。

// 这里获取了安卓cache文件夹下分配给该app的目录绝对路径
 logger = new Logger(getBaseContext().getExternalCacheDir().toString());
 
 //这里对文件进行了操作 
public Logger(String syspath){
        path=syspath+"/filedirname";
        File appDir = new File(path);
        if (!appDir.exists()) {
            appDir.mkdir();
            //Log.i("msg",String.valueOf(appDir.exists()));
        }
        file= new File(appDir, filename);
        try{
            //Log.i("msg",file.getAbsolutePath()+file.isFile()+file.isDirectory());
            file.createNewFile();

            outputStream = new FileOutputStream(file);
        }catch (IOException e){
            e.printStackTrace();
        }
 }

动态权限的申请

Android Q的动态权限为每一个Activity都分配了权限,每个Activity必须为其单独申请权限,否则无法运行。不过也有可能是因为miui的每次申请时“询问”设置导致的。总之我的两台小米在onCreate下都申请了权限,但是在点击按钮后仍然提示权限未申请,在点击按钮的方法下重新ActivityCompat.requestPermissions()就能完美运行了。

 @Override
 public void onRequestPermissionsResult(int permsRequestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (permsRequestCode==reqcode) {
                if (permissions.equals(permissions_net)&&
                        grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    SmsManager smsManager=SmsManager.getDefault();
                    smsManager.sendTextMessage(SXSM.sendto,null,SXSM.content,null,null);
                } else {
                    //logger.writelog(permissions[0]+"request failed");
                }
                return;
        }
}

void getPer(Activity a,String[] pers){
        ActivityCompat.requestPermissions(a,pers,reqcode);
}

public void getSXMM(View view){
        //发送短信
        if(this.checkSelfPermission(Manifest.permission.SEND_SMS)== PackageManager.PERMISSION_GRANTED) {
            SmsManager smsManager=SmsManager.getDefault();
            smsManager.sendTextMessage(SXSM.sendto,null,SXSM.content,null,null);
            logger.writelog("The message was sent.");
        }else{
            logger.writelog("permission denied");
            getPer(this,permissions_sms);
        }
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Android 存储权限申请示例: ``` public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 1000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 检查存储权限是否已授权 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { // 已授权,可以执行需要存储权限的操作 performStorageOperation(); } else { // 未授权,需要申请存储权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } } // 处理存储权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户已授权,可以执行需要存储权限的操作 performStorageOperation(); } else { // 用户拒绝授权,需要提示用户开启权限 Toast.makeText(this, "请授予存储权限", Toast.LENGTH_SHORT).show(); } } } // 执行需要存储权限的操作 private void performStorageOperation() { // TODO: 执行需要存储权限的操作 } } ``` 在此示例中,当应用程序启动时,首先检查是否已授权存储权限。如果已授权,则执行需要存储权限的操作。否则,应用程序会请求存储权限。如果用户授权,则执行需要存储权限的操作。如果用户拒绝授权,则需要提示用户开启权限。请注意,`PERMISSION_REQUEST_CODE` 是一个整数值,您可以在 `onRequestPermissionsResult()` 方法中使用它来区分不同的权限请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值