DEV Community

SameX
SameX

Posted on

鸿蒙Next实战:构建社交应用新生态

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

(一)即时通讯功能

  1. 文本消息发送与接收 使用鸿蒙 Next 的网络通信 API(假设为net模块)实现文本消息的发送和接收。当用户在聊天界面输入文本消息并点击发送按钮时,视图模型层获取消息内容,通过net模块将消息发送到服务器。服务器收到消息后,根据消息的接收方进行消息推送。应用在接收方的设备上通过监听服务器推送的消息,使用net模块接收消息,并更新视图层的聊天记录显示。例如:
import { net } from '@kit.NetworkKit';

// 发送文本消息
async function sendTextMessage(message: string, recipient: string): Promise<void> {
  let request = net.createHttpRequest();
  request.method = 'POST';
  request.url = 'https://your-server-url/send-message';
  request.headers = { 'Content-Type': 'application/json' };
  request.requestBody = JSON.stringify({ message, recipient });
  try {
    await request.send();
    if (request.responseCode === 200) {
      console.log('文本消息发送成功。');
    } else {
      console.error('文本消息发送失败,错误码:', request.responseCode);
    }
  } catch (error) {
    console.error('文本消息发送过程中出错:', error);
  }
}

// 接收文本消息(假设在服务器推送消息时调用此函数)
function receiveTextMessage(message: string): void {
  // 更新视图层的聊天记录显示,这里假设视图模型层提供了更新聊天记录的方法 updateChatRecord()
  viewModel.updateChatRecord(message);
}
Enter fullscreen mode Exit fullscreen mode
  1. 语音消息发送与接收 对于语音消息,在获取麦克风权限后,使用音频录制相关 API(假设为audioRecorder模块)进行语音录制。录制完成后,将音频数据转换为合适的格式(如mp3),再通过网络通信 API 发送到服务器。接收方在收到语音消息后,使用音频播放相关 API(假设为audioPlayer模块)进行播放。例如:
import { audioRecorder, audioPlayer } from '@kit.MediaKit';
import { net } from '@kit.NetworkKit';

// 录制语音消息
async function recordVoiceMessage(): Promise<ArrayBuffer> {
  let recorder = audioRecorder.createRecorder();
  recorder.start();
  // 假设设置录制时长为 10 秒
  await new Promise(resolve => setTimeout(resolve, 10000));
  recorder.stop();
  let audioData = await recorder.getAudioData();
  // 将音频数据转换为 mp3 格式(这里假设存在 convertToMp3() 方法进行格式转换)
  let mp3Data = convertToMp3(audioData);
  return mp3Data;
}

// 发送语音消息
async function sendVoiceMessage(recipient: string): Promise<void> {
  let voiceData = await recordVoiceMessage();
  let request = net.createHttpRequest();
  request.method = 'POST';
  request.url = 'https://your-server-url/send-voice-message';
  request.headers = { 'Content-Type': 'audio/mp3' };
  request.requestBody = voiceData;
  try {
    await request.send();
    if (request.responseCode === 200) {
      console.log('语音消息发送成功。');
    } else {
      console.error('语音消息发送失败,错误码:', request.responseCode);
    }
  } catch (error) {
    console.error('语音消息发送过程中出错:', error);
  }
}

// 接收语音消息并播放(假设在服务器推送消息时调用此函数)
function receiveVoiceMessage(voiceData: ArrayBuffer): void {
  let player = audioPlayer.createPlayer();
  player.setDataSource(voiceData);
  player.prepare();
  player.start();
}
Enter fullscreen mode Exit fullscreen mode
  1. 图片消息发送与接收 在拍照或从相册选择图片后,使用文件读取 API 读取图片数据,再通过网络通信 API 将图片数据发送到服务器。接收方收到图片消息后,使用图片展示相关 API(如Image组件)在聊天界面显示图片。例如:
import { fileIo } from '@kit.CoreFileKit';
import { net } from '@kit.NetworkKit';

// 发送图片消息
async function sendImageMessage(filePath: string, recipient: string): Promise<void> {
  let fileContent = await fileIo.readFile(filePath);
  let request = net.createHttpRequest();
  request.method = 'POST';
  request.url = 'https://your-server-url/send-image-message';
  request.headers = { 'Content-Type': 'image/jpeg' };
  request.requestBody = fileContent;
  try {
    await request.send();
    if (request.responseCode === 200) {
      console.log('图片消息发送成功。');
    } else {
      console.error('图片消息发送失败,错误码:', request.responseCode);
    }
  } catch (error) {
    console.error('图片消息发送过程中出错:', error);
  }
}

// 接收图片消息并显示(假设在服务器推送消息时调用此函数)
function receiveImageMessage(fileContent: ArrayBuffer): void {
  // 将图片数据转换为可用于显示的格式(如 ImageSource),这里假设存在 convertToImageSource() 方法
  let imageSource = convertToImageSource(fileContent);
  // 在聊天界面显示图片,这里假设视图层提供了显示图片的方法 showImage()
  view.showImage(imageSource);
}
Enter fullscreen mode Exit fullscreen mode

(二)位置服务功能

  1. 获取用户当前位置 如前文所述,使用位置控件获取用户当前位置信息。当用户点击位置分享按钮时,通过geoLocationManager.getCurrentLocation()方法获取位置信息,包括经度、纬度等。例如:
import { geoLocationManager } from '@kit.LocationKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

// 获取当前位置信息的函数
function getCurrentLocationInfo() {
  const requestInfo: geoLocationManager.LocationRequest = {
    'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
   'scenario': geoLocationManager.LocationRequestScenario.UNSET,
    'timeInterval': 1,
    'distanceInterval': 0,
   'maxAccuracy': 0
  };
  try {
    geoLocationManager.getCurrentLocation(requestInfo)
.then((location: geoLocationManager.Location) => {
      promptAction.showToast({ message: JSON.stringify(location) });
      // 在这里可以将获取到的位置信息进行分享操作,如发送给好友等
    })
.catch((err: BusinessError) => {
      console.error(`Failed to get current location. Code is ${err.code}, message is ${err.message}`);
    });
  } catch (err) {
    console.error(`Failed to get current location. Code is ${err.code}, message is ${err.message}`);
  }
}
Enter fullscreen mode Exit fullscreen mode
  1. 绘制地图与导航(假设集成第三方地图库) 若要在应用中实现绘制地图和导航功能,可以集成第三方地图库(如高德地图、百度地图等鸿蒙 Next 支持的地图库)。在获取用户位置信息后,将位置信息传递给地图库,实现地图上的定位标记显示。例如,使用高德地图库的 API(假设为amap模块):
import { amap } from '@kit.MapKit';

// 在地图上显示用户位置
function showUserLocationOnMap(location: geoLocationManager.Location): void {
  let map = amap.createMap('map-container');
  let marker = amap.createMarker({
    position: {
      longitude: location.longitude,
      latitude: location.latitude
    }
  });
  map.addMarker(marker);
}
Enter fullscreen mode Exit fullscreen mode

对于导航功能,根据用户输入的目的地和当前位置,调用地图库的导航接口,实现路径规划和导航引导。例如:

// 导航到目的地
async function navigateToDestination(destination: string): Promise<void> {
  let currentLocation = await getCurrentLocationInfo();
  let route = await amap.getRoute(currentLocation, destination);
  amap.startNavigation(route);
}
Enter fullscreen mode Exit fullscreen mode

(三)文件上传和下载功能

  1. 照片上传 在用户选择分享照片时,除了发送图片消息外,还可以提供将照片上传到服务器进行存储或备份的功能。使用文件读取 API 读取照片数据,然后通过网络通信 API 将照片数据上传到服务器。例如:
import { fileIo } from '@kit.CoreFileKit';
import { net } from '@kit.NetworkKit';

// 上传照片
async function uploadPhoto(filePath: string): Promise<void> {
  let fileContent = await fileIo.readFile(filePath);
  let request = net.createHttpRequest();
  request.method = 'POST';
  request.url = 'https://your-server-url/upload-photo';
  request.headers = { 'Content-Type': 'image/jpeg' };
  request.requestBody = fileContent;
  try {
    await request.send();
    if (request.responseCode === 200) {
      console.log('照片上传成功。');
    } else {
      console.error('照片上传失败,错误码:', request.responseCode);
    }
  } catch (error) {
    console.error('照片上传过程中出错:', error);
  }
}
Enter fullscreen mode Exit fullscreen mode
  1. 文件下载(如下载聊天记录备份等) 若应用提供下载功能,例如下载聊天记录备份文件,使用网络通信 API 发送下载请求,接收服务器返回的文件数据,并使用文件写入 API 将文件保存到本地。例如:
import { net } from '@kit.NetworkKit';
import { fileIo } from '@kit.CoreFileKit';

// 下载文件
async function downloadFile(downloadUrl: string, savePath: string): Promise<void> {
  let request = net.createHttpRequest();
  request.method = 'GET';
  request.url = downloadUrl;
  try {
    await request.send();
    if (request.responseCode === 200) {
      await fileIo.writeFile(savePath, request.responseData);
      console.log('文件下载成功,保存路径:', savePath);
    } else {
      console.error('文件下载失败,错误码:', request.responseCode);
    }
  } catch (error) {
    console.error('文件下载过程中出错:', error);
  }
}
Enter fullscreen mode Exit fullscreen mode

四、总结与展望

通过本次实战,我们成功构建了一个基于鸿蒙 Next 系统的社交应用,涵盖了消息发送、照片分享和位置信息共享等核心功能。在开发过程中,我们充分运用了鸿蒙 Next 的 MVVM 架构、权限机制、安全控件、位置服务和网络操作等关键技术,确保了应用的稳定性、安全性和功能性。

展望未来,随着鸿蒙 Next 系统的不断发展和生态的日益完善,我们可以进一步拓展社交应用的功能。例如,结合鸿蒙 Next 的分布式技术,实现跨设备的无缝社交体验,让用户在不同设备间自由切换,保持社交互动的连续性。同时,引入更多人工智能技术,如智能推荐好友、智能聊天机器人等,提升用户体验和社交乐趣。希望本文能够为鸿蒙 Next 同行者提供有益的参考和借鉴,激发更多创新应用的开发,共同构建繁荣的鸿蒙 Next 应用生态。

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs