当前位置:   article > 正文

Harmony 读取图库图片数据,存储到数据库中,并从数据库表中取出显示在Image控件中_andorid开发鸿蒙系统写入内存并且获取图片

andorid开发鸿蒙系统写入内存并且获取图片

主要实现思路:

1、打开系统自带图库。代码如此:

需要提前设置imgRequestCode。

  1. private final int imgRequestCode=1123;
  2. private void selectPic() {
  3. Intent intent = new Intent();
  4. Operation opt=new Intent.OperationBuilder().withAction("android.intent.action.GET_CONTENT").build();
  5. intent.setOperation(opt);
  6. intent.addFlags(Intent.FLAG_NOT_OHOS_COMPONENT);
  7. intent.setType("image/*");
  8. startAbilityForResult(intent, imgRequestCode);
  9. }

2、在自带图库关闭后重写onAbilityResult事件。

  1. @Override
  2. protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) {
  3. if(requestCode==imgRequestCode)
  4. {
  5. //选择的Img对应的Uri
  6. String chooseImgUri=resultData.getUriString();
  7. //定义数据能力帮助对象
  8. DataAbilityHelper helper=DataAbilityHelper.creator(getContext());
  9. //定义图片来源对象
  10. ImageSource imageSource = null;
  11. //获取选择的Img对应的Id
  12. String chooseImgId=null;
  13. //如果是选择文件则getUriString结果为content://com.android.providers.media.documents/document/image%3A30,其中%3A是":"的URL编码结果,后面的数字就是image对应的Id
  14. //如果选择的是图库则getUriString结果为content://media/external/images/media/30,最后就是image对应的Id
  15. //这里需要判断是选择了文件还是图库
  16. if(chooseImgUri.lastIndexOf("%3A")!=-1){
  17. chooseImgId = chooseImgUri.substring(chooseImgUri.lastIndexOf("%3A")+3);
  18. }
  19. else {
  20. chooseImgId = chooseImgUri.substring(chooseImgUri.lastIndexOf('/')+1);
  21. }
  22. //获取图片对应的uri,由于获取到的前缀是content,我们替换成对应的dataability前缀
  23. Uri uri=Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI,chooseImgId);
  24. try {
  25. //读取图片
  26. FileDescriptor fd = helper.openFile(uri, "r");
  27. imageSource = ImageSource.create(fd, null);
  28. //创建位图
  29. PixelMap pixelMap = imageSource.createPixelmap(null);
  30. //设置图片控件对应的位图
  31. image.setPixelMap(pixelMap);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. } finally {
  35. if (imageSource != null) {
  36. imageSource.release();
  37. }
  38. }
  39. }
  40. }

3、保存数据库时需要将Image控件的图片转换成byte[]二进制数据。

  1. //将图片转换成byte[]
  2. public byte[] getBytes(Image image) {
  3. PixelMap pm = image.getPixelMap();
  4. ImagePacker imagePacker = ImagePacker.create();
  5. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  6. ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions();
  7. imagePacker.initializePacking(byteArrayOutputStream, packingOptions);
  8. imagePacker.addImage(pm);
  9. imagePacker.finalizePacking();
  10. byte[] bytes = byteArrayOutputStream.toByteArray();
  11. return bytes;
  12. }

4、保存数据库相关代码如下:

  1. private Image image = (Image)findComponentById(ResourceTable.Id_dingdan_tupian);
  2. saveButton.setClickedListener(new Component.ClickedListener() {
  3. @Override
  4. public void onClick(Component component) {
  5. byte[] tp = getBytes(image);
  6. String saveSQL = "insert into test " +
  7. "(rupiah) " +
  8. "values " +
  9. "(?)";
  10. store.executeSql(saveSQL,new Object[]{tp});
  11. }
  12. });

5、到此图片就保存到数据库中了。

以下是从数据库中取出并显示在Image控件中:

1、取出的数据为byte[],必须转换成PixelMap

  1. public PixelMap ByteToPixelMap(byte[] bytes){
  2. // 用于 ImageSource的 create(bytes,srcOpts)方法
  3. ImageSource.SourceOptions srcOpts=new ImageSource.SourceOptions();
  4. //设置图片原格式也可以用 null
  5. srcOpts.formatHint="image/jpg";
  6. ImageSource imageSource=ImageSource.create(bytes,srcOpts);
  7. //通过ImageSource创建 PixelMap文件
  8. PixelMap pixelMap=imageSource.createPixelmap(null);
  9. return pixelMap;
  10. }

2、将数据从数据库取出,并利用上述函数转换成PixelMap

  1. public PixelMap getPixelMap(String selectedID){
  2. String querySQL = "select blobType from test where id = ?";
  3. ResultSet rl = store.querySql(querySQL, new String[]{selectedID});
  4. byte[] getbyte = null;
  5. PixelMap pixelMap = null;
  6. while (rl.goToNextRow()) {
  7. getbyte = rl.getBlob(rl.getColumnIndexForName("blobType"));
  8. pixelMap = ByteToPixelMap(getbyte);
  9. }
  10. return pixelMap;
  11. }

3、将数据直接赋值给Image控件

  1. private Image image1 = (Image)findComponentById(ResourceTable.Id_dingdan_tupian1);
  2. queryButton.setClickedListener(new Component.ClickedListener() {
  3. @Override
  4. public void onClick(Component component) {
  5. image1.setPixelMap(getPixelMap("1"));
  6. }
  7. });

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/277185
推荐阅读
相关标签
  

闽ICP备14008679号