权限问题:
Android6(API 23)2015年之前 AndroidManifest.xml标注即可。在安装程序时可以看到程序所需权限,完全接收程序可以获取清单文件标注的权限,拒绝则程序安装不成功。
Android 6-10 动态申请权限(AndroidManifest.xml中同样也需要标注权限)。
所以,开发应用程序基本就动态申请就对了,反正也兼容低版本。
存储问题:
首先介绍一下计算机中的内存与外存,内存(RAM,Random Access Memory)和外存(存储器,硬盘、固态硬盘(SSD)、SD卡,U盘,光盘)。
Android系统存储数据的变化:
1.Android 1.x-2.x:较早的Android版本使用的是基于Flash的YAFFS(Yet Another Flash File System)文件系统来管理内部存储。这些版本中的应用程序数据存储在设备的内部闪存(ROM)上,并且没有提供直接访问的公共存储目录。
2.Android 3.x-4.4:从Android 3.0开始,Google引入了基于Linux文件系统的扩展文件系统(Ext4)作为内部存储的首选文件系统。这些版本中引入了外部存储的概念,即SD卡。应用程序可以将数据存储在内部存储(ROM)或可移动的SD卡上。
- 内部存储:应用程序的私有数据存储在内部存储中,并且只有该应用程序本身可以访问这些数据。这些数据通常存储在/data/data/<package_name>/目录下。
- 外部存储:应用程序可以将公共数据存储在外部存储中,例如图片、音频、视频等。这些数据存储在SD卡上,并且可以通过相应的API进行访问。
***getFilesDir():data/…. 内部存储空间(ROM)中应用程序私有的内部存储空间路径,只能被本应用程序访问,无需获取读写权限。
Environment.getExternalStorageDirectory() /storage/emulated/0/DCIM 获取外部存储空间(SD卡)路径(共享目录路径)需要获取读写权限。
如果并没有插入外部存储卡,这个方法获取到的同样也是内部存储的路径,可以理解为一个内部存储空间虚拟的SD卡。
3.Android 4.4-9.0:从Android 4.4开始,Google引入了存储框架(Storage Framework),并推出了"Storage Access Framework"(SAF)来改善外部存储的访问方式。
SAF提供了标准化的API,使应用程序可以与用户设备上的各种存储提供者进行交互,包括内部存储和可移动的SD卡。这样,应用程序可以通过统一的接口来读取和写入各种存储位置的文件。 ****使用 SAF 提供的文件选择器和 DocumentProvider API(6.0之前不用动态。6.0后动态申请权限(这里指的是敏感权限))
此外,Android 4.4引入了应用程序私有目录(App-specific directories),使应用程序可以在外部存储中创建自己的私有目录,而不需要获取其他特定权限。
4.Android 10及以上:从Android 10开始,Google进一步加强了对外部存储的访问限制。默认情况下,应用程序只能访问其私有目录和公共存储目录(例如Music/、Pictures/等),对于其他外部存储中的文件,应用程序需要请求特定的权限。
Scoped Storage(作用域存储)是Android 10引入的新特性,它更加严格控制了应用程序对外部存储的访问权限。每个应用程序都有自己的私有目录,无法直接访问其他应用程序的文件。应用程序只能通过声明适当的权限或使用SAF来访问其他文件。
总结:6.0后动态权限(敏感的权限需动态),存储的话,内部存储/外部存储都需要统一的DocumentProvider API,并且能在外部存储创建私有目录,应用程序只能访问其私有目录和公共存储目录。
从 Android 10(API 级别 29)开始,Android 引入了一些关于访问外部存储的变更,这可能导致在真机上使用 Environment.getExternalStoragePublicDirectory() 方法无法正常工作。
在 Android 10 及更高版本中,Environment.getExternalStoragePublicDirectory() 方法被标记为弃用,并且不再访问应用的外部存储空间。相反,它返回的是一个应用私有目录的路径,而非共享存储空间中的公共目录。
为了支持对外部共享存储空间的访问,Android 引入了新的存储访问框架,即 Storage Access Framework(SAF)和 MediaStore API。这些框架提供了更安全、更灵活的方式来管理外部存储访问权限和文件操作。
如果你需要在真机上访问共享存储空间中的特定目录(例如 Movies 目录),你可以考虑使用以下方法之一:
- 使用 Intent 和 ACTION_OPEN_DOCUMENT_TREE 启动 SAF,允许用户选择共享存储目录,并获取访问权限。
- 使用 MediaStore API 来访问特定类型的媒体文件,例如影片、音频或图像。
请注意,无论使用哪种方法,你仍然需要请求适当的权限,并与用户进行交互以获取所需的访问权限。
总结起来,如需在真机上访问外部共享存储空间,传统的 Environment.getExternalStoragePublicDirectory() 方法已不再适用。应使用新的存储访问框架(如 SAF 和 MediaStore API)来管理访问权限和文件操作。
敏感权限:
在 Android 系统中,许多应用程序需要获取系统权限才能完成某些操作。比如,访问用户的联系人、获取设备的位置信息、使用相机等。获取权限的主要目的是确保应用程序只能在经过用户授权的情况下,才能访问敏感信息或执行敏感操作,以保护用户的隐私和安全。
通常情况下,只有具有特定权限的应用程序才能执行以下操作:
访问敏感数据:例如用户的联系人、短信、电话记录等
执行系统级别的操作:例如在后台运行、启动服务、开机自启等
控制硬件设备:例如使用相机、录音、定位等
更改系统设置:例如更改屏幕亮度、打开蓝牙、激活谷歌地图等
当应用程序需要访问受保护的资源时,Android 系统会弹出一个对话框,询问用户是否授予应用程序所请求的权限。用户可以选择授予或拒绝权限。如果用户拒绝了权限请求,应用程序可能无法正常工作。
需要注意的是,在 Android 6.0 及以上版本中,系统引入了运行时权限(Runtime Permission)机制。这个机制要求应用程序在运行时请求需要的权限,并且用户可以在任何时候撤销权限。这使用户可以更好地控制应用程序访问敏感信息和执行敏感操作的方式。
总之,Android 应用程序需要获取系统权限来执行敏感操作并访问受保护的资源,以保护用户的隐私和安全。在请求权限时,应用程序应该清楚地说明所需的权限,并尽可能遵循最佳实践,以确保用户信任和满意。