栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 前沿技术 > 云计算 > Docker/k8s

基于鸿蒙分布式跨设备文件服务-信件管理

Docker/k8s 更新时间:发布时间: 百科书网 趣学号



想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

一. 前言

先说说写这个跨设备文件服务信件管理应用前, 都想过做什么, 首先看了梁迪迪的基于分布式文件服务的文本编辑器,也想做一个文档的,比如创建word,excel,pdf文件,然后点击可以打开WPS软件来编辑,可惜搜索了网上找不到打开WPS方法,最后放弃了;然后想到弄一个画板,在画板上画上自己想表达的内容,保存为图片,跨设备可以打开图片查看,开始时保存图片,想用截屏的方法,查看文档没有找到Java调用系统的截屏方式,看到了JS的,但是要API7才支持,最后也放弃了,然而脑子里一闪,想起以前读书时,自习课不用大声说话,很多同学都是通过传纸条,那时也流行写信件,就往这个想法开始撸码,这里有几个知识点,之前没有写过,比如怎么把文本框输入的内容写到信纸上,然后保存为图片,在另一台设备上点击图片,可以查看里面的内容,通过网上搜索,还是找到相似的知识点, 才能在今天里做出了这个跨设备查看文件应用.

先简单说一下这个跨设备信件管理应用,A手机创建一封信件,生成图片,在A手机显示本地端, 在B手机显示远程端, 同时A,B手机都可以打开查看信件内容,这里使用到了分布式数据库管理,使用列表存储图片名,方便列表显示出来,然后点击相应的图片,获取到图片名,再到分布式文件路径获取到图片,显示出来.

二. 实现效果

开发工具环境下视频:https://www.bilibili.com/video/BV16L4y1i7b1/

手机+手机环境下视频:https://www.bilibili.com/video/BV1mL411g72B/



三. 创建工程

在这当作你已经安装好最新版本DevEco-Studio开发工具, 点击File -> New -> New Project… 弹出Create HarmonyOS Project窗口, 这里我选择空白Java模板创建, 上一个视频播放实例是用JS写的界面,这个跨设备信件管理界面就用Java来写,还是JS写界面快,调试也快些.


基于鸿蒙分布式跨设备文件服务-信件管理-鸿蒙HarmonyOS技术社区

Java模块布局模块



四. 主界面开发

先介绍公共类Java代码,有了这些公共类,以后做类似功能的应用,可以直接复制公共类文件可以使用:

DistributedFileUtil 分布式文件工具类:

  1. package com.army.study.util;  
  2. import com.army.study.ResourceTable; import ohos.agp.render.Canvas; 
  3. import ohos.agp.render.Paint; import ohos.agp.render.Texture; 
  4. import ohos.agp.utils.Color; import ohos.app.Context; 
  5. import ohos.global.resource.NotExistException; import ohos.media.image.ImagePacker; 
  6. import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; 
  7. import ohos.media.image.common.Size;  
  8. import java.io.*; import java.util.ArrayList; 
  9. import java.util.Arrays; import java.util.List; 
  10.   
  11. public class DistributedFileUtil {     // 上下文 
  12.     private final Context mContext;  
  13.      
  14.     public DistributedFileUtil(Context context) {         this.mContext = context; 
  15.     }  
  16.      
  17.     public PixelMap writeLetter(String fileName, String letterContent) {         // 获取分布式文件路径 
  18.         String filePath = mContext.getDistributedDir() + File.separator + fileName + ".jpg";         Texture texture=null; 
  19.         try {             // 从资源文件获取信纸背景图片 
  20.             InputStream inputStream = mContext.getResourceManager().getResource(ResourceTable.Media_bg);             ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions(); 
  21.             srcOpts.formatHint = "image/jpeg";             ImageSource imageSource = ImageSource.create(inputStream, srcOpts); 
  22.             // 设置图片参数             ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions(); 
  23.             decodingOptions.desiredSize=new Size(720,1080);             PixelMap pixelMap = imageSource.createPixelmap(decodingOptions); 
  24.             //用于保存画图结果             texture=new Texture(pixelMap); 
  25.             Canvas canvas=new Canvas(texture);             Paint paint=new Paint(); 
  26.             paint.setTextSize(50);             paint.setStrokeWidth(8); 
  27.             paint.setColor(Color.BLACK);             // 把内容写到信纸上 
  28.             canvas.drawChars(paint,letterContent.toCharArray(),50,140);             // 文件输出流 
  29.             FileOutputStream fos=new FileOutputStream(filePath);  
  30.             ImagePacker imagePacker = ImagePacker.create();             ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions(); 
  31.             packingOptions.format = "image/jpeg";//只支持image/jpeg             packingOptions.quality = 90; 
  32.             boolean result = imagePacker.initializePacking(fos, packingOptions);             if(result) 
  33.             {                 //这里获取绘画后的pixelMap用来保存 
  34.                 result = imagePacker.addImage(texture.getPixelMap());                 if (result) { 
  35.                     long dataSize = imagePacker.finalizePacking();                     System.out.println("文件大小:"+dataSize); 
  36.                     ToastUtil.getInstance().showToast(mContext, "创建成功!");                 } 
  37.             }  
  38.             fos.flush();             fos.close(); 
  39.         } catch (IOException | NotExistException e) {             System.out.println("文件保存出错:"+e.getMessage()); 
  40.             e.printStackTrace();         } 
  41.                  return texture.getPixelMap(); 
  42.     }  
  43.      
  44.     public PixelMap readImage(String fileName, String letterContent) {         // 获取分布式文件路径 
  45.         String filePath = mContext.getDistributedDir() + File.separator + fileName;         // 根据分布式文件路径,生成文件 
  46.         File file = new File(filePath);         if (!file.exists()) { 
  47.             // 如果文件不存在, 调用写信件             writeLetter(fileName, letterContent); 
  48.         }         // 图片参数 
  49.         ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();         srcOpts.formatHint = "image/jpeg"; 
  50.         // 创建图片源         ImageSource imageSource = ImageSource.create(file, srcOpts); 
  51.         // 生成图片         PixelMap pixelMap = imageSource.createPixelmap(null); 
  52.          return pixelMap; 
  53.     }  
  54.      
  55.     public List getFileList() {         // 获取分布式文件列表 
  56.         File[] files = mContext.getDistributedDir().listFiles();         List listFile = new ArrayList<>(Arrays.asList(files)); 
  57.         // 排序文件顺序         listFile.sort((file, newFile) -> { 
  58.             if (file.lastModified() > newFile.lastModified()) {                 return -1; 
  59.             } else if (file.lastModified() == newFile.lastModified()) {                 return 0; 
  60.             } else {                 return 1; 
  61.             }         }); 
  62.         List listFileName = new ArrayList<>();         // 获取文件列表文件名 
  63.         for (File f : listFile) {             if (f.isFile()) { 
  64.                 String name = f.getName();                 listFileName.add(name); 
  65.             }         } 
  66.         return listFileName;     } 

ToastUtil 提示信息框:

  1. package com.army.study.util;  
  2.  import com.army.study.ResourceTable; 
  3. import ohos.agp.components.Component; import ohos.agp.components.LayoutScatter; 
  4. import ohos.agp.components.Text; import ohos.agp.window.dialog.ToastDialog; 
  5. import ohos.app.Context;  
  6.  
  7. public class ToastUtil {     private ToastDialog toastDialog; 
  8.      private ToastUtil() { 
  9.     }  
  10.     public static ToastUtil getInstance() {         return ToastUtilInstance.INSTANCE; 
  11.     }  
  12.     private static class ToastUtilInstance {         private static final ToastUtil INSTANCE = new ToastUtil(); 
  13.     }  
  14.      
  15.     public void showToast(Context context, String content) {         if (toastDialog != null && toastDialog.isShowing()) { 
  16.             toastDialog.cancel();         } 
  17.          Component toastLayout = LayoutScatter.getInstance(context) 
  18.                 .parse(ResourceTable.Layout_layout_toast, null, false);         Text toastText = (Text) toastLayout.findComponentById(ResourceTable.Id_text_msg_toast); 
  19.         toastText.setText(content);         toastDialog = new ToastDialog(context); 
  20.         toastDialog.setComponent(toastLayout);         toastDialog.setTransparent(true); 
  21.         toastDialog.show();     } 

预览信件内容:

  1.  public class PreviewLetterDialog extends CommonDialog { 
  2.      public PreviewLetterDialog(Context context, PixelMap imgId) { 
  3.         super(context);         Component container = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_dialog_previce_letter, null, false); 
  4.         setContentCustomComponent(container);         setSize(MATCH_PARENT, MATCH_CONTENT); 
  5.          setCornerRadius(AttrHelper.vp2px(20, context)); 
  6.          Image image = (Image) container.findComponentById(ResourceTable.Id_preview); 
  7.         image.setPixelMap(imgId);  
  8.          Button btnCancel = (Button) container.findComponentById(ResourceTable.Id_button_dialog_create_file_cancel); 
  9.         Button btn/confirm/i = (Button) container.findComponentById(ResourceTable.Id_button_dialog_create_file_/confirm/i);  
  10.         btnCancel.setClickedListener(component -> { destroy();});         btn/confirm/i.setClickedListener(component -> { destroy();}); 
  11.     }  

写信件对话框:

  1.  public class CreateLetterDialog extends CommonDialog { 
  2.     private OnCallBack onCallBack;  
  3.     public CreateLetterDialog(Context context) {         super(context); 
  4.         Component container = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_dialog_write_letter, null, false);         setContentCustomComponent(container); 
  5.          Optional display = DisplayManager.getInstance().getDefaultDisplay(context); 
  6.         int width = (int) (display.get().getAttributes().width * 0.9);         int height = AttrHelper.vp2px(270, context); 
  7.         setSize(width, height);         setCornerRadius(AttrHelper.vp2px(20, context)); 
  8.          TextField letterContent = (TextField) container.findComponentById(ResourceTable.Id_tf_dialog_create_file_name); 
  9.         Button btnCancel = (Button) container.findComponentById(ResourceTable.Id_button_dialog_create_file_cancel);         Button btn/confirm/i = (Button) container.findComponentById(ResourceTable.Id_button_dialog_create_file_/confirm/i); 
  10.         btn/confirm/i.setEnabled(false);         btn/confirm/i.setAlpha(0.5f); 
  11.         letterContent.addTextObserver((text, i, i1, i2) -> {             if(text.isEmpty()){ 
  12.                 btn/confirm/i.setEnabled(false);                 btn/confirm/i.setAlpha(0.5f); 
  13.             }else{                 btn/confirm/i.setEnabled(true); 
  14.                 btn/confirm/i.setAlpha(1f);             } 
  15.         });  
  16.         btnCancel.setClickedListener(component -> { destroy();});  
  17.         btn/confirm/i.setClickedListener(component -> {             if(onCallBack!=null){ 
  18.                 // 设备ID                 String deviceID = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(context)) 
  19.                         .getLocalDeviceInfo().getId();                 // 组合文件名,方便区分是否为当前设备创造的文件 
  20.                 String name = deviceID + "-" + letterContent.getText();                 onCallBack.on/confirm/i(name); 
  21.             }             destroy(); 
  22.         });     } 
  23.      public void setonCallBack(OnCallBack onCallBack) { 
  24.         this.onCallBack = onCallBack;     } 
  25.      public interface OnCallBack { 
  26.         void on/confirm/i(String name);     } 

 主界面代码图:


基于鸿蒙分布式跨设备文件服务-信件管理-鸿蒙HarmonyOS技术社区

讲解到此了,不要忘记了config.json文件的权限配置哦,在module下添加

  1. "reqPermissions": [     { 
  2.       "name": "ohos.permission.DISTRIBUTED_DATASYNC"     }, 
  3.     {       "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  4.     },     { 
  5.       "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"     }, 
  6.     {       "name": "ohos.permission.WRITE_MEDIA" 
  7.     },     { 
  8.       "name": "ohos.permission.READ_MEDIA"     } 
  9.   ], 

 想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com



 

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/796743.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号