最近在开发时,需要下载一个文件,但是Android上的getexternalstoragepublicdirectory显示已过期(deprecated)。于是谷歌了一下,搜到了这篇文章
从共享存储空间访问文档和其他文件
。
原来,现在的Android系统,将文件系统划分为下面几项:
具体可以查看
数据和文件存储概览
,文章里有非常详细的介绍。这里主要看应用共享存储空间与共享存储。其中应用专属存储空间无需申请权限,在应用卸载的时候会移除文件。如果文件存储在外部存储空间中的目录内,其他应用也可以访问。而共享存储需要权限,在 Android 10(API 级别 29)或更高版本中,访问其他应用的文件需要
READ_EXTERNAL_STORAGE
或
WRITE_EXTERNAL_STORAGE
权限。在 Android 9(API 级别 28)或更低版本中,访问
所有
文件均需要相关权限,其中存储的文件不会随着应用的卸载而被移除。
所以我考虑将用户无需长期保存的文件存储在应用专属存储空间的外部存储空间中,这样的好处是无需申请权限,可以使用
getExternalFilesDir()
或
getExternalCacheDir()
方法来获取路径。
以前在开发中,都是通过path来定位文件,而在Android 4.4(API 级别 19)及更高版本的设备上,可以使用存储访问框架与包括外部存储卷和云端存储空间在内的
文档提供器
互动。也就是
从共享存储空间访问文档和其他文件
里的主要内容。并且现在采用uri来对文件进行操作,File也可替换成DocumentFile。
存储访问框架支持以下访问文件和其他文档的用例。
具体代码可以查看文档,需要注意的是,现在需要调用
startActivityForResult
加载系统文件选择器选择相对应的文件夹。比如系统Download文件夹的uri为
Uri.parse(Environment.DIRECTORY_DOWNLOADS)
。新建文件的代码如下:
const val CREATE_FILE = 1
private fun createFile(pickerInitialUri: Uri) {
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/pdf"
putExtra(Intent.EXTRA_TITLE, "invoice.pdf")
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
startActivityForResult(intent, CREATE_FILE)
检索新建项目的 URI
override fun onActivityResult(
requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == your-request-code
&& resultCode == Activity.RESULT_OK) {
resultData?.data?.also { uri ->
其他操作基本相同,文档里都有详细描述。随着Android版本的升高,对文件的管理也越来越严格,以后还得多参考官方文档进行操作。
最近在开发时,需要下载一个文件,但是Android上的getexternalstoragepublicdirectory显示已过期(deprecated)。于是谷歌了一下,搜到了这篇文章从共享存储空间访问文档和其他文件。原来,现在的Android系统,将文件系统划分为下面几项:应用专属存储空间共享存储偏好设置数据库具体可以查看数据和文件存储概览,文章里有非常详细的介绍。这里主要看应用共享存储空间与共享存储。其中应用专属存储空间无需申请权限,在应用卸载的时候会移除文件。如果文件存储在外部存储空
Environment.getExternalStorageDirectory()是获得外部存储的第一层的对象,可以通过这个对象获得这一层的各个文件的名称,路径,以及建立其中一个文件的抽象对象。
代码如下: File files = Environment.getExternalStorageDirectory();//获得外部存储器的第一层的文件对象
File fil
内部存储是指系统内部存储空间,**在逻辑上用目录来区分的话就是data目录下的文件夹**
除此之外data目录下有app目录存放系统下载的apk信息,有data目录存放各种文件
sharedPreferenced存储的文件在 /data/data/<packagename>/shared_prefs/目录下。
Sqlite存储的文件在 /data/data/<packagename>/database/目录下。
从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。
从Android 4.1开始,读操作受权限READ_EXTERNAL_STORAGE保护。
从Android 4.4开始,应用可以管理在它外部存储上的特定包名目录,而不用获取WRITE_EXTERNAL_STORAGE权限。
比如,一个包名为com.example.foo的应用,可以自...
public static void startCamera(Fragment fragment){
File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+
File.separator+user_icon.jpg);
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//int
Android系统 = Linux内核 + Android运行时。
Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。Android运行时从下到上又包括了HAL层、应用程序框架层和应用程序层。HAL层主要是为规避GPL而设计的,它将将硬件驱动分成内核空间和用户空间两部分,其中用户空间两部分采用的是商业友好的Apache License。应用程序框架层主要包括系统服务,例如组件管理服务、应用程序安装服务、窗口管理服务、多媒体服务和电信服务等。应用程序框架进一步又分为C/C++和Java两个层次,Java代码运行Dalvik虚拟机之上,并且通过JNI方法和C/C++交互。应用程序层主要就是由四大组件Activity、Service、Broadcast Receiver和Content Provider构成,它们是应用开发的基础。这个PPT从一个通用的应用程序架构开始,概述Android系统的专用驱动、HAL、关键服务、Dalvik、窗口机制和四大组件等。这个PPT 作为前面第1个PPT的延续,帮助进一步了解Android系统的具体实现。
Android系统是一个基于开放源代码的操作系统,在其架构中包括了一个系统级别的Linux内核和许多重要的系统应用与服务。这也意味着,开发人员可以对其进行定制化和修改,并且直接反映到手机或平板电脑的使用上。因此,虽然修改Android系统文件并不容易,但仍然有一些方法可以实现它。
在修改android系统代码之前,我们需要知道一些专业术语。Android系统中有一个用于定义系统和应用程序行为的核心工具——AndroidManifest.xml文件,它负责管理应用程序组件如Activity、Service、Receiver、Provider等。此外,Android还包括一个系统级的app包管理器,它负责安装、删除和升级应用程序。
关于修改android系统代码的具体方法,可以按以下步骤进行:
- 了解设备和操作系统:首先,您需要了解您的设备型号和操作系统版本,以及设备使用的处理器架构类型。.
- 获取源代码:Access the Android Open Source Project (AOSP) toolchain, clone the project-specific binary repository, find the system files to modify, and configure the relevant modules for editing.
- 找到系统文件:根据需要找到要编辑的文件,这可能是AndroidManifest.xml文件或设备驱动源文件。
- 进行修改:进行所需修改。对于一些文件,你需要使用专业的文本编辑器进行编辑修改。
- 构建和安装:根据所选的修改选择特定构建选项,编译修改内容,并通过ADB命令行安装到设备中。
总之,修改Android系统代码是一项高度技术性的工作,需要专业的知识和经验。但是如果你遵循正确的方法和工具,这可能会有意义并对你的设备具有积极的影响。不过,在进行任何代码修改操作之前,请务必备份数据以防出现潜在的风险和意外。