【Android】Android 的 API 以及 AndroidManifest.xml 中的配置 uses-sdk

本文解释了Android平台中API级别的概念,API级别是唯一标识特定Android版本框架API的整数值,它帮助确保应用程序与系统底层的兼容性和稳定性。文章详细介绍了API级别的作用、平台版本与API级别对应关系,以及如何在应用清单文件中使用API级别属性来指定应用程序所需运行的API版本范围。

API级别是什么?(What is API Level?)

API级别是一个整数值,它唯一标识了一个具体版本的Android平台,及其框架的API的版本。

Android平台提供了一套框架API,使得应用程序可以与系统底层进行交互。该框架API由以下模块组成:

  • 一组核心的包和类
  • 清单(manifest)文件的XML元素和属性声明
  • 资源文件的XML元素和属性声明及访问形式
  • 各类意图(Intents)
  • 应用程序可以请求的各类授权,以及系统中包含的授权执行

每个Android平台的后续版本会包括它提供的更新的Andr​​oid应用程序框架的API。

该框架的API的更新设计,使高版本的API与早期版本兼容。也就是说,在新版本API中大多数都是新增功能,和引进新的或替代的功能。作为API的部分升级,老的替换的部分已过时,但不会从新版本中删除,使得已有的应用程序仍然可以使用它们。在极少数情况下,旧版本API的部分可能被修改或删除,通常这种变化是为了保障API的稳定性及应用程序或系统的安全。所有其他早期版​​本的API将不做修改的保留。

一个Android平台提供的框架API,被指定一个整数标识符,称为“API级别”。每一个版本的Android平台只支持有一个API级别,虽然该支持是隐含地包括了所有早期的API级别(一直到API级别1级)。 Andr​​oid平台的最初版本提供的框架API级别是1级,随后的版本依次递增。

下表说明了具体平台版本和支持的API级别的对应关系。

平台版本

API级别

Android 3.0

11

Android 2.3.3

10

Android 2.3

9

Android 2.2

8

Android 2.1

7

Android 2.0.1

6

Android 2.0

5

Android 1.6

4

Android 1.5

3

Android 1.1

2

Android 1.0

1

 

 

Android中使用API级别(Uses of API Level in Android)

API级别标识为保证用户和应用程序开发者的最佳体验,起了关键作用:

  • 它让Android平台可以描述它支持的框架API的最高版本
  • 它让应用程序可以描述它需要的框架API版本
  • 它使得系统可以在硬件设备上安装应用程序时能够检查版本是否匹配,使得版本不兼容的应用程序不会被错误安装在设备之上.

每个版本的Android平台都在其内部存储了自己的API级别标识。

应用程序可以用框架API提供的清单文件元素 — <uses-sdk> 来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。三种属性分别描述如下:

  • android:minSdkVersion — 指明该应用程序可以运行的API最低版本。默认是“1”。
  • android:targetSdkVersion — 指明该应用程序设计时期望运行的目标API版本。在某些情况下,这允许应用程序使用目标API级别下定义的清单元素或行为,而不是只限于使用最低API级别定义的内容。(译者注:android之targetsdkversion的理解---兼容性问题)
  • android:maxSdkVersion — 指明该应用程序可以运行的最高API级别。重要声明: 使用该属性之前请阅读<uses-sdk>文档。

比如,要指明一个应用程序能够运行的最低API级别,应当在该应用程序的清单文件的<uses-sdk>元素中加入android:minSdkVersion属性。android:minSdkVersion的值是一个正整数,对应的是该应用程序能够运行的最低平台的API级别标识。

用户尝试安装一个应用程序,或者在系统升级后重验证应用程序的时候,Android系统首先会检查应用程序的清单文件中的<uses-sdk>属性,将其与系统内部API级别对比。系统只有在满足下列情况时才允许进行应用程序安装:

  • 如果声明了android:minSdkVersion属性,其属性值必须小于或等于该系统的API级别对应的整数值。如果未声明,系统会默认该应用程序运行需要的最低API级别是1。
  • 如果声明了android:maxSdkVersion属性,其属性值必须等于或大于该系统的API级对应的整数值。如果未声明,系统会默认该应用程序没有最高API级别限制。请通过阅读文档<uses-sdk>以获得系统如何处理该属性的更多信息。

应用程序清单文件中声明该属性后, <uses-sdk>元素看起来应类似于下面的例子:

 

这样做的主要原因是,应用程序会通过android:miniSdkVersion声明的API级别来告知系统——该应用程序使用的API是指定引入的API级别。假如没有这种属性声明,一个应用程序如果因为某些不知名的原因被安装在低级别API系统之上,那么该应用程序会在运行时因为尝试访问不存在的API而崩溃。为此,Android系统通过不允许应用程序被安装在不满足其最低API级别要求的目标硬件上来防止此类结果发生。

例如,android.appwidget类包是在API级别3中开始引入的。如果一个应用程序使用了这个API,就必须通过指明android:minSdkVersion属性为3来声明运行的最低要求。于是,该应用程序就可以在Android 1.5API级别3级)、Android 1.6 (API级别4级)等平台上安装,但是在Android 1.1 (API级别2级)和 Android 1.0 平台(API级别1级)上却是无法安装的。

<think> 我们正在讨论Android开发中的权限添加问题。用户想知道如何在AndroidManifest.xml文件中添加READ_EXTERNAL_STORAGE权限。 根据Android开发的最佳实践,添加权限需要在AndroidManifest.xml文件中使用<uses-permission>标签。 具体步骤是:在<manifest>标签下,添加<uses-permission>标签,并设置android:name属性为"android.permission.READ_EXTERNAL_STORAGE"。 注意:在Android 6.0(API级别23)及以上,除了在清单文件中声明,还需要在运行时请求该权限。但用户的问题只涉及清单文件。 因此,我们可以给出如下示例代码: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <!-- 添加读取外部存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application ...> ... </application> </manifest> ``` 注意:在Android 10(API级别29)及以上,为了更好的隐私保护,引入了分区存储(Scoped Storage)。对于读取外部存储,可能需要考虑使用其他方式,比如使用MediaStore或者请求MANAGE_EXTERNAL_STORAGE权限(该权限需要特别申请,且仅用于特定情况)。但用户明确要求READ_EXTERNAL_STORAGE,所以我们提供标准的添加方法。 另外,如果应用的目标SDK版本(targetSdkVersion)为30(Android 11)或更高,并且需要广泛访问外部存储,那么需要请求MANAGE_EXTERNAL_STORAGE权限。但READ_EXTERNAL_STORAGE权限仍然可以用于访问媒体文件(图片、视频、音频等)而不需要请求MANAGE_EXTERNAL_STORAGE。 由于用户问题明确,我们只回答如何添加READ_EXTERNAL_STORAGE权限。 接下来生成相关问题。 </think>在 Android 开发中,添加 `READ_EXTERNAL_STORAGE` 权限到 `AndroidManifest.xml` 文件的具体步骤如下: ### 添加权限步骤 1. **打开 `AndroidManifest.xml` 文件** 在 Android Studio 的项目视图中定位到 `app/manifests/AndroidManifest.xml`。 2. **在 `<manifest>` 标签内添加权限声明** 在 `<application>` 标签上方插入以下代码: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 3. **完整示例**: ```xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <!-- 添加读取外部存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <!-- 其他组件(Activity/Service等) --> </application> </manifest> ``` ### 关键注意事项 1. **运行时权限要求(Android 6.0+)** 对于 Android 6.0 (API 23) 及以上设备,还需在代码中动态请求权限: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` 2. **存储策略变更(Android 10+)** - Android 10 (API 29) 引入分区存储(Scoped Storage),默认情况下应用只能访问自身目录和公共媒体文件[^1]。 - 若需访问非媒体文件(如文档),需添加 `MANAGE_EXTERNAL_STORAGE` 权限(需上架审核)。 3. **权限作用域** `READ_EXTERNAL_STORAGE` 仅允许读取共享存储中的文件,**不包括**应用私有目录(`getExternalFilesDir()` 目录无需此权限访问)。 --- ### 常见问题解答 **Q1: 添加权限后仍无法读取文件?** - 检查动态权限请求是否已实现(Android 6.0+) - 确认文件路径位于共享存储(如 `Environment.getExternalStorageDirectory()`) - 验证文件系统实际存在该文件 **Q2: Android 11+ 是否需要额外配置?** 在 `AndroidManifest.xml` 中添加: ```xml <application android:requestLegacyExternalStorage="true" ... > ``` 以暂时禁用分区存储(但需逐步适配 Scoped Storage)[^1]。 **Q3: 权限请求被用户拒绝如何处理?** 在 `onRequestPermissionsResult()` 中引导用户开启权限: ```java @Override public void onRequestPermissionsResult(int code, String[] permissions, int[] results) { if (code == REQUEST_CODE && results[0] != PERMISSION_GRANTED) { new AlertDialog.Builder(this) .setMessage("需要存储权限以读取文件") .setPositiveButton("去设置", (d, w) -> openAppSettings()) // 跳转应用设置.show(); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值