HarmonyOS运动开发:如何选择并上传运动记录
##鸿蒙核心技术##运动开发##Core File Kit(文件基础服务)
前言
在运动类应用中,能够快速导入和分析其他应用的运动记录是一个极具吸引力的功能。这不仅为用户提供便利,还能增强应用的实用性和吸引力。本文将结合鸿蒙(HarmonyOS)开发实战经验,深入解析如何实现一个运动记录选择与上传功能,让运动数据的管理更加高效。
一、为什么需要运动记录上传功能
运动记录上传功能允许用户将其他应用(如 Keep)的运动数据导入到我们的应用中进行分析和管理。这不仅可以丰富我们的应用数据,还能为用户提供更全面的运动分析和建议。此外,通过上传功能,用户可以轻松备份和同步他们的运动记录,无论何时何地都能查看自己的运动历史。
二、核心功能实现
1.文件选择
为了实现文件选择功能,我们使用了鸿蒙的DocumentViewPicker
API。以下是文件选择的核心代码:
async selectFile() {
if (this.isLoading) return;
this.isLoading = true;
try {
let context = getContext(this) as common.Context; // 请确保getContext(this)返回结果为UIAbilityContext
let documentPicker = new picker.DocumentViewPicker(context);
let documentSelectOptions = new picker.DocumentSelectOptions();
// 选择文档的最大数目(可选)
documentSelectOptions.maxSelectNumber = 1;
// 选择文件的后缀类型['后缀类型描述|后缀类型'](可选) 若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100,选择所有文件:'所有文件(*.*)|.*';
documentSelectOptions.fileSuffixFilters = ['图片(.png, .jpg)|.png,.jpg', '文档|.txt', '视频|.mp4', '.pdf','运动数据文件|.gpx,.tcx'];
const result = await documentPicker.select(documentSelectOptions);
if (result && result.length > 0) {
const fileUri = result[0];
this.selectedFilePath = fileUri;
// 获取文件名
this.fileName = fileUri.split('/').pop() || '未知文件';
// 获取文件大小
try {
let file = fs.openSync(fileUri, fs.OpenMode.READ_ONLY);
const stat = await fs.stat(file.fd);
this.fileSize = this.formatFileSize(stat.size);
} catch (error) {
console.error('Failed to get file size:', error);
this.fileSize = '大小未知';
}
promptAction.showToast({ message: '文件选择成功', duration: 2000 });
}
} catch (err) {
console.error('Failed to select file. Cause: ' + (err as BusinessError).message);
promptAction.showToast({ message: '文件选择失败', duration: 2000 });
} finally {
this.isLoading = false;
}
}
核心点解析
• DocumentViewPicker
:用于选择文件的组件,支持多种文件类型。
• fileSuffixFilters
:设置可选择的文件类型,如图片、文档、视频等。
• fs.openSync
和fs.stat
:用于获取文件的大小和状态信息。
• promptAction.showToast
:用于显示提示信息,告知用户文件选择的结果。
2.文件上传
文件上传功能是将用户选择的文件上传到服务器进行进一步处理。这里就不多写了
三、用户界面设计
为了让用户能够方便地选择和上传文件,我们需要设计一个简洁直观的用户界面。以下是用户界面的核心代码:
@Builder
pageContentBuilder() {
Column() {
Text('选择运动记录的文件:')
.fontSize(20)
.margin({ top: 20, bottom: 10 })
.width('100%')
.textAlign(TextAlign.Center);
// 文件选择区域
Column() {
if (!this.selectedFilePath) {
Image($r('app.media.szxd_sport_home_setting_icon')) // 替换为你的文件图标资源
.width(80)
.height(80)
.margin({ bottom: 10 });
}
Text(this.selectedFilePath ? this.fileName : '请选择文件')
.fontSize(16)
.width('90%')
.height(40)
.backgroundColor('#f0f0f0')
.borderRadius(8)
.padding(10)
.textAlign(TextAlign.Center)
.margin({ bottom: 10 });
}
.width('90%')
.height(150)
.border({ width: 1, color: '#ddd', style: BorderStyle.Dashed })
.borderRadius(8)
.justifyContent(FlexAlign.Center)
.onClick(() => this.selectFile())
.margin({ bottom: 20 });
// 文件信息展示
this.fileInfoBuilder();
// 选择文件按钮
Button(this.selectedFilePath ? '重新选择文件' : '选择文件')
.onClick(() => this.selectFile())
.width('60%')
.height(40)
.fontSize(16)
.backgroundColor('#007dff')
.borderRadius(8)
.opacity(this.isLoading ? 0.5 : 1)
.enabled(!this.isLoading);
// 上传按钮(如果有上传功能)
if (this.selectedFilePath) {
Button('上传文件')
.onClick(() => this.uploadFile())
.width('60%')
.height(40)
.fontSize(16)
.backgroundColor('#07c160')
.borderRadius(8)
.margin({ top: 20 })
.opacity(this.isLoading ? 0.5 : 1)
.enabled(!this.isLoading);
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Start)
.alignItems(HorizontalAlign.Center);
}
核心点解析
• 文件选择区域:通过Image
和Text
组件展示文件选择的状态,用户点击时触发文件选择逻辑。
• 文件信息展示:通过Text
组件展示文件的名称和大小信息。
• 选择文件按钮:允许用户重新选择文件。
• 上传按钮:允许用户上传已选择的文件。
四、总结
通过鸿蒙的DocumentViewPicker
和相关文件操作 API,我们可以轻松实现运动记录的选择功能。
HarmonyOS运动开发:如何选择并上传运动记录的更多相关文章
- SNF开发平台WinForm之六-上传下载组件使用-SNF快速开发平台3.3-Spring.Net.Framework
6.1运行效果: 6.2开发实现: 1.先在要使用的项目进行引用,SNF.WinForm.Attachments.dll文件. 2.在工具箱内新建选项卡->选择项,浏览找到文件SNF.WinFo ...
- 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化
联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...
- IOS开发 APP提交程序上传流程
由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...
- 详细阐述Web开发中的图片上传问题
Web开发中,图片上传是一种极其常见的功能.但是呢,每次做上传,都花费了不少时间. 一个"小功能"花费我这么多时间,真心不愉快. So,要得认真分析下原因. 1.在最初学习Java ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- OneNET麒麟座应用开发之四:数据上传测试
已经测试过OneNET麒麟座开发板了,这次来尝试与OneNET的连接和数据上传.这也是我们测试这块开发办的主要原因,因为在十几种我们有这种将分散的采集点数据上传到后台的需求. 先看看麒麟座这块开发板, ...
- HTML5 Plus 拍照或者相册选择图片上传
HBuilder+HTML5 Plus+MUI实现拍照或者相册选择图片上传,利用HTML5 Plus的Camera.Gallery.IO.Storage和Uploader来实现手机APP拍照或者从相册 ...
- django之创建第10-1个项目-图片上传并记录上传时间
1.百度云盘:django之创建第10-1个项目-图片上传并记录上传时间 2.主要修改的配置文件有3个,forms.views和models3个文件以及html 3.forms.py文件修改 #cod ...
- 微信小程序开发之多图片上传+服务端接收
前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...
- asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
上文件传很常见,现在就文件上传利用HTML的File控件(uploadify)的,这里为大家介绍一下(uploadify)的一些使用方法.在目前Web开发中用的比较多的,可能uploadify(参考h ...
随机推荐
- AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
最近在研究AI Agent如何调用三方API,整理了一篇文章,分享给大家. 调用三方 API(Function Calling)不是通过提示词(Prompt)来实现的,而是通过函数调用机制(Funct ...
- Golang Linux、Windows、Mac 下交叉编译
前言 Golang 支持交叉编译, 即同一份代码,在一个平台上生成,然后可以在另外一个平台去执行. 之前写过一篇 Golang windows下 交叉编译 感觉写的不够全面,这篇作为补充. 交叉编译 ...
- Liunx配置sudo使oracle用户有root权限执行脚本
1. vi /etc/sudoers 将%wheel 两行前的注释# 删除 2. vi /etc/group 将oracle用户 加入 wheel组
- docker中 启动所有的容器命令
docker中 启动所有的容器命令 docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) docker中 关闭所有的容器命令 ...
- 基于DotNetty实现自动发布 - 背景篇
故事背景 小公司,单体项目,接口和页面都在一起,生产和测试环境都是 Windows 服务器和 IIS, 本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置 ...
- 网络编程-关闭连接(2)-Java的NIO在关闭socket时,究竟用了哪个系统调用函数?
背景 在上一讲网络编程-关闭连接-C/C++相关系统调用中,提到过,目前项目使用Netty框架来实现的网络编程,查看netty源码可以得知,netty最终是调用了java Nio的close接口做的关 ...
- 【Java】TCP套接字编程
服务器 server.java package socket; import java.io.*; import java.net.*; public class server { public st ...
- Java连接Redis常用操作
1.去重 package Data; import redis.clients.jedis.Jedis; public class TestRedisUniq { public static Jedi ...
- 🔥Gitlab 删除仓库文件夹
1.进入文件夹 -> 右键 -> Git Bash Here -> 打开命令窗口 2.拉取代码到本地 (本地无项目情况) git clone git地址 3.拉取最新代码(本地已有项 ...
- grequests,并发执行接口请求的方法(简易版)
有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...