当前位置: 首页 > 科技观察

HarmonyOS-DataAbilityHelper接入文件功能

时间:2023-03-12 06:04:31 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com前言(数据能力)使用数据模板(也称为数据)的能力可帮助应用程序管理自己对其他应用程序存储的数据的访问,并提供与其他应用程序共享数据的方法。数据不仅可以用于同一设备上不同应用程序之间的数据共享,还可以用于跨设备的不同应用程序之间的数据共享。数据可以以各种形式存储,例如数据库或磁盘上的文件。数据对外提供增删改查数据、文件打开等接口。这些接口的具体实现由开发者提供。URIData的提供者和使用者都使用URI(UniformResourceIdentifier,统一资源标识符)来标识一个特定的数据,比如数据库中的一个表或者磁盘上的一个文件。HarmonyOS的URI还是基于URI通用标准,格式如下:其中:scheme:协议方案名称,固定为“dataability”,代表Dataability使用的协议类型。authority:设备ID。如果是跨设备场景,就是目标设备的ID;如果是本地设备场景,则不需要填写。path:资源的路径信息,表示特定资源的位置信息。查询:查询参数。fragment:可以用来表示要访问的子资源。URI示例:跨设备场景:dataability://device_id/com.domainname.dataability.persondata/person/10本地设备:dataability:///com.domainname.dataability.persondata/person/10表示的“device_id”localdevice字段为空,所以“dataability:”后面有三个“/”。访问数据开发者可以使用DataAbilityHelper类来访问当前应用程序或其他应用程序提供的共享数据。DataAbilityHelper充当客户端与提供者的数据进行通信。Data收到请求后,进行相应的处理并返回结果。DataAbilityHelper提供了DataAbility对应的一系列方法。下面介绍使用DataAbilityHelper的具体步骤。声明使用权限如果要访问的Data声明了访问需要权限,那么访问这个Data需要在配置文件中声明需要这个权限。"reqPermissions":[{"name":"com.example.dataabilityhelperdemo.DataAbility.DATA"}]如果访问的数据是文件,还需要添加access存储读写权限:ohos.permission.READ_USER_STORAGE和ohos.允许。WRITE_USER_STORAGE。创建DataAbilityHelperDataAbilityHelper为开发者提供creator()方法(已过期),现在使用create()方法创建DataAbilityHelper实例。此方法是具有多个重载的静态方法。最常见的方法是通过传入上下文对象来创建DataAbilityHelper对象。获取辅助对象示例:DataAbilityHelperhelper=DataAbilityHelper.creator(this);访问数据能力DataAbilityHelper为开发者提供了一系列接口来访问不同类型的数据(文件、数据库等)。访问文件DataAbilityHelper为开发者提供了FileDescriptoropenFile(Uriuri,Stringmode)方法来操作文件。该方法需要传入两个参数,其中uri用于确定目标资源路径,mode用于指定打开文件的方式。可选模式包括“r”(读取)、“w”(写入)、“rw”(读写)、“wt”(覆盖)、“wa”(附加写入)、“rwt”(覆盖和可读)。该方法返回一个目标文件的FD(文件描述符),将文件描述符封装成一个流,开发者可以自定义文件流。访问数据库DataAbilityHelper为开发者提供了对数据库进行操作的增删改查、批处理等方法。创建DataAbility创建一个名为UserDataAbility的DatapublicclassUserDataAbilityextendsAbility{privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(3,0xD001100,"Demo");@OverridepublicvoidonStart(Intentintent){super.onStart(intent);HiLog.info(LABEL_LOG,"UserDataAbilityonStart");}@OverridepublicResultSetquery(Uriuri,String[]columns,DataAbilityPredicates谓词){returnnull;}@Overridepublicintinsert(Uriuri,ValuesBucketvalue){HiLog.info(LABEL_LOG,"UserDataAbilityinsert");返回999;}@Overridepublicintdelete(Uriuri,DataAbilityPredicates谓词){return0;}@Overridepublicintupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicates谓词){return0;}@OverridepublicFileDescriptoropenFile(Uriuri,Stringmode){returnnull;}@OverridepublicString[]getFileTypes(Uriuri,StringmimeTypeFilter){returnnewString[0];}@OverridepublicPacMapcall(Stringmethod,Stringarg,PacMapextras){returnnull;}@OverridepublicStringgetType(Uriuri){返回空值;删除、修改、检查、打开文件、获取文件类型、回调、获取Uri类型和onStart方法config.json配置文件中会自动添加如下配置:..."abilities":[{"skills":[{"entities":["entity.system.home"],"actions":["action.system.home"]}],"orientation":"unspecified","name":"com.example.dataabilityhelperdemo.MainAbility","icon":"$media:icon","description":"$string:mainability_description","label":"$string:entry_MainAbility","type":"page","launchType":"standard"},{"permissions":["com.example.dataabilityhelperdemo.DataAbilityShellProvider.PROVIDER"],"name":"com.example.dataabilityhelperdemo.UserDataAbility","icon":"$media:icon","description":"$string:userdataability_description","type":"data","uri":"dataability://com.example.dataabilityhelperdemo.UserDataAbility"}]在上面的配置中:type:类型为数据。uri:对外提供的访问路径,唯一。permissions:访问DataAbility时需要申请的访问权限。关键代码://初始化文件privatevoidinitFile(){//获取文件目录FiledataDir=newFile(this.getDataDir().toString());if(!dataDir.exists()){dataDir.mkdirs();}//目标文件targetFile=newFile(Paths.get(dataDir.toString(),"name.txt").toString());RawFileEntryrawFileEntry=this.getResourceManager().getRawFileEntry("resources/rawfile/name.txt");尝试{Resourceresource=rawFileEntry.openRawFile();FileOutputStreamfos=newFileOutputStream(targetFile);字节[]缓冲区=新字节[4096];整数计数=0;while((count=resource.read(buffer))>=0){fos.write(buffer,0,count);}resource.close();fos.close();}catch(IOExceptione){e.printStackTrace();}}initFile方法用来初始化文件,将源文件写入目标文件,ResourceManager类的getRawFileEntry方法,获取RawFileEntry类,RawFileEntry类代表rawfile目录下的文件,最后可以通过rawFileEntry.openRawFile()获取指定文件名的文件。在资源目录的rawfile目录下创建一个名为name.txt的文件。内容如下:HarmonyOS效果展示获取文件数据ability_main.xml布局文件,点击按钮显示文件里面的内容。关键代码如下:publicclassMainAbilitySliceextendsAbilitySlice{privateButtonbutton;私人文本textDesc;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_主要的);button=(Button)findComponentById(ResourceTable.Id_button);textDesc=(Text)findComponentById(ResourceTable.Id_text_helloworld);button.setClickedListener(侦听器->this.getFile());}privatevoidgetFile(){DataAbilityHelperhelper=DataAbilityHelper.creator(this);Uriuri=Uri.parse("dataability:///com.example.dataabilityhelperdemo.UserDataAbility");试试{FileDescriptorfileDescriptor=null;fileDescriptor=helper.openFile(uri,"r");textDesc.setText(FileUtils.getFileContent(fileDescriptor));}catch(DataAbilityRemoteException|IOExceptione){e.printStackTrace();}}}FileUtils.java:publicclassFileUtils{publicstaticStringgetFileContent(FileDescriptorfd)throwsIOException{FileInputStreamfis=newFileInputStream(fd);int=0;StringBuilder构建器=newStringBuilder();尽管((a=fis.read())!=-1){builder.append((char)a);}fis.close();返回builder.toString();}}源码下载链接总结访问文件关键是获取目标文件的文件描述符,使用文件描述符封装的文件流,进行文件操作。了解更多开源内容请访问:51CTO开源基础软件社区https://ost.51cto.com。