安卓 接入Weex Base64位图片无法显示完美解决办法

weex android 选择文件 拍照 获得uri 并转为文件真实路径 转base64码 回传weex public class findModule extends WXModule { /** * 打开本地文件器 */ JSCallback callback; @JSMethod(uiThread = true) public void openPdf(final JSCallback callback) { ... 阅读详情

最近需求中需要接入Weex 老规矩 先撸一遍文档 很顺利接完 结果官网偏偏没给加载图片的具体方案

添加依赖

     compile 'com.taobao.android:weex_sdk:0.17.0'
     这个有多个版本 建议用新的
     compile 'com.alibaba:fastjson:1.1.46.android'
     compile 'com.android.support:recyclerview-v7:24.1.0'
     compile 'com.android.support:appcompat-v7:24.1.0'
     Weex的底层依赖这三个包 如果没有就添加上  

到这里基本完事 开始初始化 在Applocation中调用

        WXEnvironment.addCustomOptions("appName","TBSample");
        WXSDKEngine.initialize(this,
                new InitConfig.Builder()
                        .setImgAdapter(new ImageAdapter())
                        .build());

这里的ImageAdapter需要自己自定义,并且继承IWXImgLoaderAdapter 并实现其中的方法

加载图片的关键就在这里,网上一大堆重复的代码,比如采用Picasso加载图片,很大一部分没什么用处,因为我们拿到的很可能是Base64位的图片 当然也可以手动Base64转Bitmap ,但是不保证每次都能成功,起码我自己就没成功,看代码

public class ImageAdapter implements IWXImgLoaderAdapter {

  @Override
  public void setImage(final String url, final ImageView view,
                       WXImageQuality quality, WXImageStrategy strategy) {

    WXSDKManager.getInstance().postOnUiThread(new Runnable() {

      @Override
      public void run() {
        if (view == null || view.getLayoutParams() == null) {
          return;
        }
        if (TextUtils.isEmpty(url)) {
          view.setImageBitmap(null);
          return;
        }
        String temp = url;
        if (url.startsWith("//")) {
          temp = "http:" + url;
        }
        if (view.getLayoutParams().width <= 0 || view.getLayoutParams().height <= 0) {
          return;
        }
        Uri uri = Uri.parse(temp);

        ImageDecodeOptions decodeOptions = ImageDecodeOptions.newBuilder()
                .setBackgroundColor(Color.GREEN)
                .build();

        ImageRequest request = ImageRequestBuilder
                .newBuilderWithSource(uri)
                .setImageDecodeOptions(decodeOptions)
                .setAutoRotateEnabled(true)
                .setLocalThumbnailPreviewsEnabled(true)
                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)
                .setProgressiveRenderingEnabled(false)
                .build();

        if (view instanceof DraweeView) {
          Log.d("FrescoImageAdapter", "load: " + url);
          ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
            @Override
            public void onFinalImageSet(
                    String id,
                    @Nullable ImageInfo imageInfo,
                    @Nullable Animatable anim) {
              if (imageInfo == null) {
                return;
              }
              QualityInfo qualityInfo = imageInfo.getQualityInfo();
              FLog.d("Final image received! " +
                              "Size %d x %d",
                      "Quality level %d, good enough: %s, full quality: %s",
                      imageInfo.getWidth(),
                      imageInfo.getHeight(),
                      qualityInfo.getQuality(),
                      qualityInfo.isOfGoodEnoughQuality(),
                      qualityInfo.isOfFullQuality());
            }

            @Override
            public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
              FLog.d("", "Intermediate image received");
            }

            @Override
            public void onFailure(String id, Throwable throwable) {
              FLog.e(getClass(), throwable, "Error loading %s", id);
            }
          };
          DraweeController controller = Fresco.newDraweeControllerBuilder()
                  .setAutoPlayAnimations(true)
                  .setControllerListener(controllerListener)
                  .setUri(uri)
                  .setImageRequest(request)
                  .build();
          ((DraweeView) view).setController(controller);

        } else {
          ImagePipeline imagePipeline = Fresco.getImagePipeline();
          DataSource<CloseableReference<CloseableImage>>
                  dataSource = imagePipeline.fetchDecodedImage(request, new Object());
          DataSubscriber dataSubscriber =
                  new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
                    @Override
                    public void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {

                      CloseableReference<CloseableImage> imageReference = dataSource.getResult();
                      if (imageReference != null) {
                        try {
                          // do something with the image
                          Preconditions.checkState(CloseableReference.isValid(imageReference));
                          CloseableImage closeableImage = imageReference.get();
                          if (closeableImage instanceof CloseableStaticBitmap) {
                            CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) closeableImage;
                            view.setImageBitmap(closeableStaticBitmap.getUnderlyingBitmap());
                            // boolean hasResult =  null != closeableStaticBitmap.getUnderlyingBitmap();
                          } else {
                            throw new UnsupportedOperationException("Unrecognized image class: " + closeableImage);
                          }
                        } finally {
                          imageReference.close();
                        }
                      }
                    }

                    @Override
                    public void onFailureImpl(DataSource dataSource) {
                    }
                  };

          dataSource.subscribe(dataSubscriber, UiThreadImmediateExecutorService.getInstance());
        }
      }
    }, 0);
  }
}



这里用的 Fresco来加载图片 Picasso默认是不支持加载Base64位的图片的 至于其他的能不能加载可以尝试一下,不过用此方法基本可行。需要添加上这两个依赖

    compile 'com.facebook.fresco:fresco:0.12.0+'
    compile 'com.facebook.fresco:animated-gif:0.12.0'

新建一个类来渲染界面

public class WeexActivity extends AppCompatActivity implements IWXRenderListener{

    @BindView(R.id.WeexGroup)
    RelativeLayout WeexGroup;
    private WXSDKInstance mWXSDKInstance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weex);
        ButterKnife.bind(this);
        mWXSDKInstance = new WXSDKInstance(this);
        mWXSDKInstance.registerRenderListener(this);
        mWXSDKInstance.renderByUrl("WXSample","http://dotwe.org/raw/dist/1721a811dc70c3cc3dc25263bb36f2aa.bundle.wx",null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC);
    }


    @Override
    public void onViewCreated(WXSDKInstance instance, View view) {
        WeexGroup.addView(view);
        System.out.println("----------onViewCreated"  + view+"  " + instance);
    }

    @Override
    public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
        System.out.println("----------onRenderSuccess" + width+"   " + height+"  " + instance);
    }

    @Override
    public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
        System.out.println("----------onRefreshSuccess" + width+"   " + height+"  " + instance);
    }

    @Override
    public v`这里写代码片`oid onException(WXSDKInstance instance, String errCode, String msg) {
        System.out.println("----------onException" + msg+"   " + errCode+"  " + instance);
    }
}
我这里用的是加载网络的js  当然也可以加载本地的  具体的细节官网给的很清楚,以及参数等等

xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/WeexGroup"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</RelativeLayout>

大概就这么多内容 基本的加载调用就可以了 关于其他错误

这里需要添加
    defaultConfig {
        ndk {
            abiFilters "x86"
            abiFilters "armeabi"
        }
        如果编译不通过 那么
gradle.properties中添加  android.useDeprecatedNdk=true   重新编译即可  到此,坑就填平了。
Android-技术的下半场 安全专题 安全专题就离多数比较远了,这里我们讲解一些常见的和业务相关的安全话题,具体后续补充。高可用专题 后续补充GC专题 后续补充。 阅读详情

相关推荐

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

base64方式显示控件

data:,文本数据 data:text/plain,文本数据 data:text/html,HTML代码 data:text/html;base64,base64编码的HTML代码 data:text/css,CSS代码 data:text/css;base64,base64编码的CSS代码 ...

weixin_30297281的博客 472

ComfyUI入门学习-教程篇

深入的 ComfyUI 教程,不同功能节点的详细指南。一个比较有意思的Comfyui教程,动画式学习。从安装到基础教程、高级教程再到各种工作流。非常全面,有教程有搭建好的工作流。

wincyfu的博客 1326

weex踩坑之image图片在ios/Android不显示

使用image标签之前Android和ios需要做的配置查看官网借用官网的描述Weex 没有内置的图片下载器,因为相关的下载、缓存、解码机制非常复杂,一些开源的工具如 SDWebImage 已经处理得很好, 所以在使用 &lt;image&gt; 之前,请在 native 侧先接入相应的 adapter 或者 handler。参见: Android adapter 和 iOS handler。图片...

weixin_33890526的博客 2156

ROS相机内参标定详细步骤指南

相机标定的目的是为了确定相机内部参数和外部参数,以便修正图像并将图像坐标映射到世界坐标,或者从世界坐标映射到图像坐标。这个过程是计算机视觉和三维感知任务的关键步骤之一,它有以下主要目的: 1. **减小畸变**:相机镜头和传感器可能引入径向和切向畸变,使得图像中的直线变得弯曲或者物体的形状不准确。通过标定相机,可以矫正这些畸变,使图像更准确。

m0_56661101的博客 1万+

IEEE PHM 2012轴承数据实战:用LSTM预测剩余寿命的完整流程与调参心得

本文详细解析了如何利用IEEE PHM 2012轴承数据集和LSTM模型进行轴承剩余寿命预测。从数据预处理、特征工程到LSTM模型架构设计和调参技巧,提供了完整的实战流程。特别分享了FEMTO-ST数据集的处理方法、RUL标签构建策略以及提升预测精度的关键技巧,帮助工程师实现更准确的预测性维护。

weixin_31100517的博客 368

上传base64图片无法显示

使用base64上传的图片中可能包含‘+’,而‘+’在x-www-form-urlencoded中表示连接符,被替换成了空格,所以图片数据不完整无法显示 需要在请求前将'+'替换为‘%2B’。 参考链接:http://stackoverflow.com/questions/14802715/base64-over-http-post-losing-data-objective-c

caiya6的专栏 2212

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5550

微信小程序安卓系统下不显示BASE64图片问题

&lt;image&gt;标签中的data属性必须写为:image/png 不能是img/png    或者是jpg等其他格式 that.setData({ captchaImage: 'data:image/png;base64,' + res.data}); 否则,在IOS下没问题,安卓下集体出BUG!  ...

UVB-76电台 1502

头歌工程实训答案-机器学习篇之手写体识别篇

第2关:激活函数'''x:负无穷到正无穷的实数'''if x<=0:return 0else:return x#***第3关:反向传播算法import os。

m0_71537260的博客 2518

第12步 支持向量机(SVM)

搭建SVM

Jet4505的博客 1050

weex 加载三端(android ios web) 本地图片 解决(项目中已实践)

本文讲解内容为weex加载三端*本地*图片,所写解决方案均已验证,使用sdk版本为0.18.0,其他版本不能保证可行。

MR CUI的专栏 3474

NLP高频面试题(一)——Transformer的基本结构、作用和代码实现

本文详细介绍了Transformer模型的基本结构和PyTorch代码实现过程。首先解析了Transformer的核心组成部分,包括嵌入层、多头自注意力机制、位置编码、前馈神经网络、编码器和解码器等模块,并通过清晰的代码示例逐步展示了如何在PyTorch中构建完整的Transformer模型。文末提供了一个可运行的简单示例,帮助读者快速理解并实践Transformer的核心原理与实现方法。

WeLearnNLP 1026

Weex UI 常见问题解答与实战技巧

还在为 Weex UI 使用中的各种问题头疼吗?从滑动组件异常到打包配置错误,从图片加载问题到多平台适配,本文将为你系统梳理 Weex UI 开发中最常见的 20+ 问题,并提供详细的解决方案和实战技巧。读完本文,你将掌握: - ✅ 组件滑动异常的完整解决方案 - ✅ 图片资源的最佳实践与性能优化 - ✅ Webpack 打包配置的深度调优 - ✅ 多平台适配的实战技巧 - ✅ 性能优化与内存管...

gitblog_01146的博客 527

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

weex-image-crop-picker 扩展图片选择器,支持对相册与相机的图片进行压缩裁剪以及相册多选或视频选择等...

weex-image-crop-picker 由于weex market里的weex-image-picker插件并无裁剪和多选功能,看到也是从react-native-image-picker移植来的,并且该插件原作者推荐了功能比较多的 react-native-image-crop-picker ,于是产生了此项目。 Android...

weixin_34392435的博客 324

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

weex初学踩坑记录-weex-loader0.7.2版本

最近公司的项目中用到了alibaba的一个app 解决方案 weex 这个框架, 总之是一不小心的入得坑,目前初学阶段已经踩了许多坑了,总而言之这东西是有点坑的。官方手册也不是很完整。应该目前市场上使用的也不多 强烈建议等这玩意儿稳定了之后大家在使用这个框架 目前是使用weex 、vue结合的方式来开发一个APP的 记录下踩坑记录 路由问题 目测目前的weex不支持vue的路由中的c...

柠檬说葡萄你好酸 959

android 监测bug上传到服务器,【报Bug】安卓PUT请求发送arraybuffer,服务器收到的数据为空...

详细问题描述(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)[内容]项目需求需要从安卓设备上传图片到服务器或者OSS。这里采取的是用plus.io fileReader读出图片的base64编码并转换成arraybuffer, 再通过put请求传送至服务器。请求成功但是服务器收到的数据为空。...

weixin_34656543的博客 417

Android开发两年,跳槽面试小公司面试官说我可以试试大厂---,Android小程序开发实例

开源库用过哪些 自己平时写项目学习,基本都用过,原理也了解;重构项目的资讯模块用了Retrofit & RxJava,自己思考优化了代码框架,比如线程切换、页面查找等,其实弄清楚原理,要改哪里一目了然 项目中Socket是怎么分包、编码的? 包类型分为Text类型、Table类型、资源类型、曲线类型、交互模式数据(曲线类型属性主要是点,关键方法append,可以增量更新数据) 公司自己定义了个Base64编码,算法当然不要去纠结了 延伸了下压缩(主要用于Table和曲线类型)和加密(参考HTTPS.

m0_66264630的博客 219

微信小程序开发分析总结

本文主要记录一下初次开发小程序一些注意事项,小程序开发语言,对小程序的审核要求,小程序的特点,开发特点,后面会再写下是否有三方好用的工具,及开发中遇到的js,html,css 相关的问题及解决方法。毕竟借小程序写js,html,css,感谢小程序,让我深深感到iOS开发环境xcode还是多么好用的。 基础了解 类目: 不得超出小程序类目范围,不得与其他小程序相似,不得与微信功能...

吹泡泡的星星 1万+

webview与js的交互效果图转HTML

使用webview与js的交互,demo中包含js打电话,打开不同activity https://github.com/ZengHongHua/WebViewJSOpenActivity weex版本,device的一些操作,例如 扫一扫、网络、振动、加速计、拨打电话、用户截屏 https://github.com/scholar-ink/weex-device基于Webview的二次封装,用于加载常用的网页(支持拨打电话/拍照/从相册选择)等 https://github.com/dolphkon/we

chezabo6116的博客 186

Android-技术的下半场,一位Android大牛的BAT面试心得与经验总结

省流专题 上面谈到了图片的压缩,其实节省流量是一个永恒的话题,它不仅能改善用户体验,也能帮助减少用户流量开销,节省公司成本。因此,本专题会谈一谈如何监控Android流量;有哪些常用的Diff及压缩算法,比如Tinker里自研的Diff算法 vs Google提出的google-diff vs BsDiff等;如何选用数据通信格式如json、ProtoBuf;FastJson、Jackson各自的优势等等。网络专题 大多数业务同学对网络的认识就是,实际上,网络这一块还存在非常多值得研究的技术点。

2401_83977825的博客 1172

uni-app 开发总结

框架介绍 uni-app 的框架是基于 vue 的单文件组件来开发的,自带 ui 框架,可以完成 h5 的开发;使用了 weex 的原生渲染引擎,可以开发安卓和苹果 app ;还可以发布到各类小程序平台,举个栗子:微信小程序、支付宝小程序、百度小程序、头条小程序等等等。 其实还有一个跨多平台开发的框架,那就是 taro ,这是基于 react native 来开发的,不过学习成本可能会比较高。 项...

liwenhui的博客 4738

uni-app简单入门

一. uni-app的简单介绍 什么是uni-app? uni-app 是使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台。 uni-app的优点? 跨平台发行,运行体验更好 与小程序的组件、API一致; 兼容weex原生渲染,增加了开发效率高,但是由于weex坑比较多,建议还是使用局部渲染优化; 通用前端技术栈,学习成本更低 支持vue语法,微信小程序API 内嵌mpvue 开发生态,组件更丰富 支持通过npm安装第

weixin_46419373的博客 1898

uni-app入门

一、uni-app简单介绍 什么是uni-app uni-app是使用Vue.js开发跨平台应用的前端框架,开发者编写的一套代码,可编译到iOS、Android Q、H5、小程序等多个平台 uni-app的优点 跨平台发行,运行体验更好 与小程序的组件、api一致; 兼容weex原生渲染,增加了开发效率高,但是由于wexx坑比较多,建议还是使用局部渲染优化; 支持Vue语法,微信小程序API ...

zuomengjia的博客 326

平时遇到的问题整理

android 平时与到的问题总结整理

李锦锋 1万+
上一篇: Java汉字转换为拼音
下一篇: 安卓 做一个简单的背景阴影
我有名有姓
博客等级 码龄10年 1粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值