关于Android权限问题的一点思考

本文详细对比了Android 6.0及以上版本与5.0至4.3版本之间的权限管理差异。对于6.0及以上版本,文章介绍了如何在使用权限前进行动态申请,并处理权限请求的回调。而对于5.0至4.3版本,则讨论了如何通过try-catch块来判断特定权限(如录音、拍照等)是否被禁用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信做过android的人都知道android6.0及以上的权限管理和5.0以下是不一样的。有很多的建议是不要让你的targetSdk大于23,这样就可以采用22及以下的权限管理方案。

然而在使用时却发现不是这样。

1)Android6.0的权限管理时,你在使用的时候去申请。

      这句话的意思是你在使用某些重要权限时,

     先判断这个权限是否在清单文件AndroidManifest.xml中申请,如果没有则动态申请权限requestPermission。弹出权限申请提示框

     然后还需要判断权限是否被禁止(是否授权),如果未开启,则去requestPermission申请权限,同样也会有权限提示框,.如果权限开启了则直接使用

     在权限提示框申请权限的时候如果你同意或者禁止,在Activity的onRequestPerssionResult中会有回调

     

2)android5.0-android4.3,一般你在清单文件中配置了权限,则会默认开启了权限。

       但是在调用一些方法需要使用到权限时,首次会弹出提示框,提示你是否允许或者拒绝使用

       不管你此时是拒绝还是禁止,是不会走Activity的onRequestPerssionResult的回调方法。

       此时你得到的结果一直是权限已经GRANT

       突然想到了一句话:上帝为你关上一扇门的时候,必然会留下一道窗 。(希望你从窗户里面跳出去。哈哈)

      如果想判断权限被禁止。很多的博文给出的结果是用try{}catch()方式,通过在使用的时候抛异常得到权限是否被禁止。如果权限禁止,大部分设备使用的时候会抛异常

      注意大部分是:第一,拍照权限如果被禁止,此时通过Camera.open()方式是会抛异常,得到你期盼的结果。即可知道拍照设备已经被禁止

                                  第二,你如果使用AduioRecord来录音,也可以获得你想要的答案。同时可以获得AudioRecord的state()能得到设备是否被正常开启开判断是否禁止使用

       但如果你使用MediaRecord来录音,当你调用start()方法时此时try{}catch并不会得到你想要的答案。此时要想得到。可以通过判断录音文件是否生成来得到正确的结果

       即如果你禁止了录音权限,虽然MediaRecord.start()能正常运行。但是不会得到输出文件。需要对try{}catch和文件是否存在来判断是否录音权限被禁止使用

       

       在代码中处理android5.0-4.3 处理MediaRecord权限时你实际上就需要进行2次 MediaRecord.start()来处理

       public boolean isValidAudio(){

                  try{

                         .....

                        

MediaRecord.setOutput(fileName)

MediaRecord.start()

.....

return true;

                  }catch(){

return false;

                 }

                return false;

      }

     public boolean isExistAudioFile(){

     File file = new File(fileName);

     if(file.exist()) return true;

    retrun false;  

   }

       if(!isValidAudio()  ||  !isExistAudioFile()){

          录音被禁止,提示去进设置申请权限

         }

      此处还有个小窍门。为了绕过你第一次使用start()方法而弹出权限申请,但你禁止后你却不能立即得到被禁止的结果。

     但你点击录音的时候一定在之前做过一次isValidAudio操作。比如你进Activity的时候调用,或者如微信,当你点击录音按钮A时会弹出一个大的按住此录音的图标B。

     此时你在点击按钮A时也可以做isValidAudio操作

 ------------------------------------------------------------------------------------------------------------------------------------------

很多时候,不管是看到还是听到“人什么时候最害怕”、、、有无数种答案。

而我的答案是“当你要去实现它,得到它,但你对此一无所知,或者是一知半解是面对的茫然,才是最害怕!”

---------------------------------------------------------------------------------------------------------------------------------------------

仅以此文敬给和我一起为权限而受到折磨的兄弟朋友。。。

同时要感谢给我思路和灵感的同事朋友。。。


<think>好的,我现在需要回答用户关于Android不同API版本特性及兼容性的问题。首先,我需要理解用户的具体需求。用户提到“不同Android API版本的功能或兼容性”,所以需要整理各个主要版本的特性变化,并说明如何做兼容性处理。 接下来,我得回忆一下Android的主要版本更新。比如Android 5.0引入Material Design,6.0的运行时权限,7.0的文件权限变化,8.0的后台限制,9.0的网络限制,10.0的后台启动Activity限制,11.0的存储权限调整,12.0的隐私仪表盘,13.0的通知权限,14.0的后台服务限制等。这些版本的变化对开发者的影响较大,需要重点说明。 然后,用户提供的引用中有关于minSdkVersion的设置,后台启动Activity的问题,file_paths的配置,以及高版本API在低版本系统的兼容处理。需要将这些内容整合到回答中,确保引用正确。 在结构方面,应该先概述API版本升级带来的问题,然后分版本介绍特性及兼容性适配,最后给出通用兼容性处理方法。每个版本需要说明关键特性、兼容性问题及解决方法,并标注对应的引用来源。 需要注意引用标注的位置,例如在提到Android Q后台启动Activity限制时,要引用[^2]。在讨论高版本API在低版本系统的兼容处理时,引用[^4]。同时,引用中的minSdkVersion设置和file_paths配置也要适当引入。 还需要检查每个要点的正确性,比如Android 4.4引入透明状态栏,是否准确?记得Android 4.4(API 19)确实在界面设计上有较大变化。Android 8.0的后台限制,如后台服务需要前台服务权限,这一点也需要确认。 另外,回答中的代码示例,比如file_paths.xml的配置,要使用正确的格式,用代码块包裹,并注意转义字符是否正确处理。例如用户提供的引用[^3]中的XML内容,需要正确展示。 最后,生成相关问题时要确保问题与主题相关,能够引导用户进一步思考或解决实际问题。比如问如何适配Android 10的存储权限,如何处理Android 6.0的运行时权限等。 现在需要将以上思路整理成结构清晰的中文回答,确保引用正确,语法正确,数学公式正确使用$...$,独立公式用$$...$$,但在这个问题中可能用不到数学公式,所以重点在代码块和引用标注上。</think>### Android不同API版本特性及兼容性适配指南 #### 一、Android版本升级的核心矛盾 随着Android系统迭代,新API版本引入新功能,但旧设备无法及时更新系统。开发者需通过`minSdkVersion`和`targetSdkVersion`平衡功能与兼容性[^1]。例如设置`minSdkVersion=8`可兼容到Android 2.2,但需在代码中处理新特性失效的情况。 #### 二、关键版本特性及适配方案 1. **Android 5.0 (API 21)** - **特性**:Material Design设计语言、JobScheduler API - **兼容性**:使用AppCompat库实现材质设计向下兼容 ```xml implementation 'androidx.appcompat:appcompat:1.6.1' ``` 2. **Android 6.0 (API 23)** - **特性**:运行时权限机制 - **适配方案**: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE); } ``` 3. **Android 7.0 (API 24)** - **特性**:FileProvider文件共享机制 - **适配步骤**: ① 声明FileProvider: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` ② 创建`res/xml/file_paths.xml`: ```xml <?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="." /> </paths> ``` 4. **Android 10 (API 29)** - **特性**:禁止后台启动Activity、分区存储 - **适配方案**: - 使用`ActivityResultContracts.StartActivityForResult`替代直接启动 - 访问媒体文件使用`MediaStore` API - 关键限制:即使有前台服务也无法后台启动Activity[^2] #### 三、通用兼容性处理策略 1. **版本检测** ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 使用新API } else { // 降级方案 } ``` 2. **兼容库选择** | 功能模块 | 兼容库 | |----------------|-------------------------| | 界面组件 | AndroidX AppCompat | | 生命周期管理 | AndroidX Lifecycle | | 权限处理 | AndroidX ActivityResult | 3. **测试策略** - 使用Android Studio的`API Level Filter`进行多版本测试 - 重点关注`minSdkVersion`和`targetSdkVersion`边界版本 #### 四、典型问题解决方案 **场景**:Android 9.0 (API 28)网络限制 - **问题**:默认禁止明文HTTP流量 - **适配**: ① 在`res/xml/network_security_config.xml`中配置: ```xml <network-security-config> <base-config cleartextTrafficPermitted="true"/> </network-security-config> ``` ② 在AndroidManifest中引用: ```xml <application android:networkSecurityConfig="@xml/network_security_config"> </application> ``` **场景**:Android 12 (API 31)模糊定位 - **特性**:新增`ACCESS_COARSE_LOCATION`和`ACCESS_FINE_LOCATION`分离 - **适配**:在清单文件明确声明精度需求: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值