深圳那个网站建设鞍山网站哪家好
深圳那个网站建设,鞍山网站哪家好,凡客诚品售后,WordPress使用百度分享插件Android Scoped Storage适配完全指南关键词#xff1a;Android、Scoped Storage、适配、存储权限、文件访问摘要#xff1a;本文将全面介绍Android Scoped Storage的相关知识#xff0c;从背景出发#xff0c;详细解释核心概念#xff0c;阐述其原理和架构#xff0c;给出…Android Scoped Storage适配完全指南关键词Android、Scoped Storage、适配、存储权限、文件访问摘要本文将全面介绍Android Scoped Storage的相关知识从背景出发详细解释核心概念阐述其原理和架构给出具体的算法实现步骤结合项目实战案例进行代码解读分析实际应用场景推荐相关工具和资源探讨未来发展趋势与挑战。旨在帮助开发者全面掌握Android Scoped Storage的适配方法顺利完成应用的升级改造。背景介绍目的和范围在Android系统不断发展的过程中为了更好地保护用户的隐私和数据安全Google推出了Scoped Storage分区存储机制。本指南的目的就是帮助开发者了解Scoped Storage的相关概念、原理和适配方法使开发者能够将应用适配到支持Scoped Storage的Android系统上。本指南的范围涵盖了Scoped Storage的核心概念、算法原理、代码实现、实际应用场景等方面。预期读者本指南主要面向Android开发者尤其是那些需要将应用适配到Android 10及以上系统的开发者。对于初学者来说本指南可以帮助他们快速了解Scoped Storage的基本知识对于有一定经验的开发者来说本指南可以提供详细的技术细节和实战案例帮助他们更好地完成适配工作。文档结构概述本指南将按照以下结构进行组织首先介绍核心概念通过故事引入和通俗易懂的解释让读者了解Scoped Storage的基本概念然后阐述核心概念之间的关系并给出原理和架构的文本示意图及Mermaid流程图接着讲解核心算法原理和具体操作步骤结合Python代码进行详细阐述再给出数学模型和公式并举例说明之后通过项目实战案例介绍开发环境搭建、源代码实现和代码解读分析实际应用场景推荐相关工具和资源探讨未来发展趋势与挑战最后进行总结提出思考题并提供常见问题与解答和扩展阅读参考资料。术语表核心术语定义Scoped Storage分区存储Android 10及以上系统引入的一种存储机制它限制了应用对外部存储的访问权限使应用只能访问自己的专属目录和特定的公共目录。外部存储External Storage指的是设备上可用于存储文件的非系统分区例如SD卡或内置的大容量存储区域。应用专属目录App-Specific Directory每个应用在外部存储中都有自己的专属目录应用可以自由读写该目录下的文件而不需要额外的权限。相关概念解释存储权限在Android系统中应用访问外部存储需要相应的权限。在Scoped Storage之前应用可以通过请求READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限来访问整个外部存储而在Scoped Storage中权限管理更加精细。媒体文件Media Files如图片、音频、视频等文件在Scoped Storage中有专门的访问方式和管理机制。缩略词列表SAFStorage Access Framework存储访问框架用于在Scoped Storage中让用户选择文件或目录。核心概念与联系故事引入想象一下有一个大型的图书馆里面存放着各种各样的书籍。以前图书馆的管理比较宽松每个读者都可以自由地在图书馆的各个角落寻找和借阅书籍。但是随着图书馆的规模越来越大书籍数量越来越多这种管理方式出现了一些问题比如有些读者会随意乱放书籍导致其他读者找不到自己需要的书。于是图书馆决定采用一种新的管理方式将图书馆划分为不同的区域每个读者只能在自己的专属区域内自由活动而对于公共区域的书籍需要通过特定的流程才能借阅。Android Scoped Storage就像是这个新的图书馆管理方式它对应用访问外部存储的权限进行了限制让数据管理更加有序和安全。核心概念解释像给小学生讲故事一样** 核心概念一Scoped Storage分区存储**Scoped Storage就像是一个小区每个应用都有自己的小房子应用专属目录应用可以在自己的小房子里自由地放东西和拿东西不需要经过别人的同意。而对于小区里的公共区域公共目录应用不能随便进去拿东西需要经过一定的程序才能访问。** 核心概念二应用专属目录**应用专属目录就像是每个应用的小秘密基地。在这个基地里应用可以放心地存储自己的重要文件比如游戏应用可以把玩家的游戏记录存放在这里音乐应用可以把下载的音乐文件放在这里。其他应用是不能随便进入这个秘密基地的只有这个应用自己可以自由进出。** 核心概念三SAFStorage Access Framework**SAF就像是一个小秘书当应用需要访问公共区域的文件时它可以帮助应用和用户进行沟通。比如当一个图片编辑应用需要用户选择一张图片进行编辑时SAF就会弹出一个窗口让用户在公共的图片库中选择一张图片然后把这张图片的信息告诉给应用。核心概念之间的关系用小学生能理解的比喻Scoped Storage、应用专属目录和SAF就像一个团队Scoped Storage是队长它制定了整个团队的规则应用专属目录是队员的私人领地队员可以在自己的领地自由活动SAF是团队的沟通使者负责和外界进行沟通。** 概念一和概念二的关系**Scoped Storage规定了应用专属目录的存在和使用规则。就像队长给每个队员分配了一个私人房间队员可以在房间里自由地做自己想做的事情但是不能超出队长规定的范围。** 概念二和概念三的关系**当应用专属目录里的资源不够时应用就需要通过SAF去公共区域获取资源。就像队员在自己的房间里找不到需要的东西时就需要通过沟通使者去公共区域寻找。** 概念一和概念三的关系**Scoped Storage通过SAF来实现对公共区域文件的访问控制。队长通过沟通使者来管理队员和外界的交流确保队员在和外界交流时遵守团队的规则。核心概念原理和架构的文本示意图专业定义Scoped Storage的核心原理是通过权限管理和目录划分限制应用对外部存储的访问。应用只能访问自己的专属目录对于公共目录的访问需要通过SAF或特定的API。其架构主要包括应用层、系统层和存储层。应用层通过调用系统提供的API来访问存储层的文件系统层负责权限管理和文件访问控制存储层则是实际存储文件的地方包括应用专属目录和公共目录。Mermaid 流程图访问专属目录通过SAF访问权限管理文件访问控制文件访问控制应用应用专属目录公共目录系统层存储层核心算法原理 具体操作步骤访问应用专属目录在Android中应用可以通过以下代码访问自己的专属目录// 获取应用专属目录FileappSpecificDirgetExternalFilesDir(null);if(appSpecificDir!null){// 在专属目录下创建一个新文件FilenewFilenewFile(appSpecificDir,test.txt);try{// 写入数据FileOutputStreamfosnewFileOutputStream(newFile);fos.write(Hello, Scoped Storage!.getBytes());fos.close();}catch(IOExceptione){e.printStackTrace();}}通过SAF访问公共目录以下是一个通过SAF选择图片文件的示例代码// 创建一个Intent用于启动SAFIntentintentnewIntent(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType(image/*);// 启动SAFstartActivityForResult(intent,PICK_IMAGE_REQUEST_CODE);// 在onActivityResult方法中处理选择结果OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCodePICK_IMAGE_REQUEST_CODEresultCodeRESULT_OK){if(data!null){Uriuridata.getData();try{// 通过Uri获取文件内容InputStreaminputStreamgetContentResolver().openInputStream(uri);// 处理文件内容}catch(FileNotFoundExceptione){e.printStackTrace();}}}}数学模型和公式 详细讲解 举例说明在Scoped Storage的适配中并没有严格意义上的数学模型和公式。但是我们可以用一些简单的逻辑来描述应用对文件的访问规则。假设AAA表示应用DappD_{app}Dapp表示应用专属目录DpublicD_{public}Dpublic表示公共目录PPP表示权限。则应用对文件的访问规则可以表示为A→PselfDapp A \xrightarrow{P_{self}} D_{app}APselfDappA→PsafDpublic A \xrightarrow{P_{saf}} D_{public}APsafDpublic其中PselfP_{self}Pself表示应用访问自己专属目录的权限这个权限是默认拥有的PsafP_{saf}Psaf表示应用通过SAF访问公共目录的权限需要用户授权。举例说明一个图片编辑应用它可以自由地在自己的专属目录中存储和读取用户编辑后的图片文件因为它拥有访问自己专属目录的权限而当它需要从公共的图片库中选择一张图片进行编辑时就需要通过SAF并且获得用户的授权。项目实战代码实际案例和详细解释说明开发环境搭建打开Android Studio创建一个新的Android项目。在项目的build.gradle文件中将targetSdkVersion设置为29或更高版本以启用Scoped Storage。android{compileSdkVersion31buildToolsVersion31.0.0defaultConfig{applicationIdcom.example.scopedstorageappminSdkVersion21targetSdkVersion31versionCode1versionName1.0testInstrumentationRunnerandroidx.test.runner.AndroidJUnitRunner}...}源代码详细实现和代码解读以下是一个完整的示例代码包括访问应用专属目录和通过SAF访问公共目录importandroid.content.Intent;importandroid.database.Cursor;importandroid.net.Uri;importandroid.os.Bundle;importandroid.provider.OpenableColumns;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;importandroidx.appcompat.app.AppCompatActivity;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;publicclassMainActivityextendsAppCompatActivity{privatestaticfinalintPICK_IMAGE_REQUEST_CODE1;privateTextViewtextView;OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textViewfindViewById(R.id.textView);ButtonwriteToAppSpecificDirButtonfindViewById(R.id.writeToAppSpecificDirButton);ButtonpickImageButtonfindViewById(R.id.pickImageButton);// 写入应用专属目录的按钮点击事件writeToAppSpecificDirButton.setOnClickListener(newView.OnClickListener(){OverridepublicvoidonClick(Viewv){writeToAppSpecificDir();}});// 选择图片的按钮点击事件pickImageButton.setOnClickListener(newView.OnClickListener(){OverridepublicvoidonClick(Viewv){pickImage();}});}privatevoidwriteToAppSpecificDir(){// 获取应用专属目录FileappSpecificDirgetExternalFilesDir(null);if(appSpecificDir!null){// 在专属目录下创建一个新文件FilenewFilenewFile(appSpecificDir,test.txt);try{// 写入数据FileOutputStreamfosnewFileOutputStream(newFile);fos.write(Hello, Scoped Storage!.getBytes());fos.close();textView.setText(文件已写入应用专属目录newFile.getAbsolutePath());}catch(IOExceptione){e.printStackTrace();textView.setText(写入文件时出错e.getMessage());}}else{textView.setText(无法获取应用专属目录);}}privatevoidpickImage(){// 创建一个Intent用于启动SAFIntentintentnewIntent(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType(image/*);// 启动SAFstartActivityForResult(intent,PICK_IMAGE_REQUEST_CODE);}OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCodePICK_IMAGE_REQUEST_CODEresultCodeRESULT_OK){if(data!null){Uriuridata.getData();try{// 通过Uri获取文件内容InputStreaminputStreamgetContentResolver().openInputStream(uri);// 获取文件名StringfileNamegetFileName(uri);textView.setText(已选择图片fileName);}catch(IOExceptione){e.printStackTrace();textView.setText(读取文件时出错e.getMessage());}}}}privateStringgetFileName(Uriuri){Stringresultnull;if(uri.getScheme().equals(content)){CursorcursorgetContentResolver().query(uri,null,null,null,null);try{if(cursor!nullcursor.moveToFirst()){resultcursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));}}finally{cursor.close();}}if(resultnull){resulturi.getPath();intcutresult.lastIndexOf(/);if(cut!-1){resultresult.substring(cut1);}}returnresult;}}代码解读与分析writeToAppSpecificDir方法该方法用于向应用专属目录写入文件。首先通过getExternalFilesDir方法获取应用专属目录然后在该目录下创建一个新的文件并将数据写入该文件。pickImage方法该方法用于启动SAF让用户选择一张图片。通过创建一个Intent并设置其动作为ACTION_OPEN_DOCUMENT类型为image/*然后调用startActivityForResult方法启动SAF。onActivityResult方法该方法用于处理SAF选择结果。当用户选择了一张图片后会返回一个Uri通过该Uri可以获取文件的输入流进而读取文件内容。getFileName方法该方法用于获取文件的名称。通过Uri查询文件的元数据从中获取文件名。实际应用场景文件备份与恢复应用可以将用户的数据备份到自己的专属目录中当需要恢复数据时从专属目录中读取文件。媒体文件处理图片、音频、视频编辑应用可以通过SAF让用户选择媒体文件进行处理。文件共享应用可以通过SAF将自己的文件分享给其他应用或者接收其他应用分享的文件。工具和资源推荐Android Studio官方的Android开发工具提供了丰富的开发和调试功能。Android Developer Documentation官方的Android开发文档包含了Scoped Storage的详细介绍和使用指南。Stack Overflow一个技术问答社区开发者可以在上面查找关于Scoped Storage适配的相关问题和解决方案。未来发展趋势与挑战发展趋势更加严格的权限管理未来Android系统可能会进一步加强对应用存储权限的管理提高用户数据的安全性。更好的用户体验SAF可能会不断优化提供更加便捷的文件选择和管理界面提升用户体验。多设备同步随着多设备互联的发展Scoped Storage可能会支持更好的文件在不同设备之间的同步和共享。挑战适配难度增加对于一些旧的应用适配Scoped Storage可能会面临较大的难度需要进行大量的代码修改。兼容性问题不同的Android设备和版本可能会存在一定的兼容性问题需要开发者进行充分的测试。用户教育用户可能对新的存储机制不太熟悉需要开发者在应用中提供清晰的引导和说明。总结学到了什么核心概念回顾我们学习了Scoped Storage分区存储、应用专属目录和SAFStorage Access Framework。Scoped Storage是一种新的存储管理机制它限制了应用对外部存储的访问权限应用专属目录是每个应用在外部存储中的私人领地应用可以自由读写该目录下的文件SAF是一个用于在Scoped Storage中让用户选择文件或目录的框架。概念关系回顾我们了解了Scoped Storage、应用专属目录和SAF之间的关系。Scoped Storage规定了应用专属目录的使用规则应用可以自由访问自己的专属目录当应用需要访问公共目录时需要通过SAF并获得用户的授权。思考题动动小脑筋思考题一你能想到在哪些应用场景中Scoped Storage的权限管理机制可能会带来一些不便思考题二如果你是一个开发者你会如何优化应用在Scoped Storage下的文件访问体验附录常见问题与解答问题一在Android 10以下的系统中是否需要适配Scoped Storage答不需要Scoped Storage是从Android 10开始引入的在Android 10以下的系统中仍然使用传统的存储权限管理方式。问题二如果应用需要访问多个公共目录应该如何处理答可以多次调用SAF让用户分别选择不同的目录。也可以使用ACTION_OPEN_DOCUMENT_TREE动作让用户选择一个目录树从而获得对该目录树及其子目录的访问权限。扩展阅读 参考资料Android Developer Documentation: https://developer.android.com/about/versions/10/privacy/changes#scoped-storageStack Overflow: https://stackoverflow.com/questions/tagged/scoped-storage