wsure
wsure
  • 发布:2019-03-29 19:36
  • 更新:2019-11-01 14:10
  • 阅读:5056

UNI-APP打包webview

分类:uni-app

这是一个关于各个安卓厂商webview参差不齐造成的蛋疼的问题,虽然我知道这个问题早在16年就有过讨论,但是我不得不再提
先说说我的遭遇吧。公司开发的一款app涉及到人脸识别功能。
作为后端开发,经人推荐了解到uni-app,在看过Hello-Uni-app的demo项目后欣喜若狂,感觉有了这等神器,app开发岂不是手到擒来?
然而,我在调用前置摄像头这块是栽了。
先是调用框架的拍照方法,这种只能手动拍照,不符合需求,被否决
然后是考虑H5调用,这个方法。这个本来是解决了大部分的问题,小部分厂商机器调用出了问题,后来发现是webKit内核的webview。
经过查阅资料后,发现weex编写Component使用Nvue引入似乎是解决问题的最佳途径,但是本人能力有限,也没找到可参考的项目(曾经反编译了插件市场的身份证OCR插件,发现其中使用了不少百度ocr的Ui,但是后来项目比较紧,也没时间细细研究了)。
近期,因为业务需要,我司向某国内小厂商订购定制机。蛋疼的事终于爆发了,这个小厂家虽然系统版本和市面上一样较新,7.0-8.0都有,但是他们的机子里还是使用安卓4.4时的webkit内核webview,导致的结果是前置摄像头拿到的画面非常暗(拍到的画面里除了灯光其余一律都是黑的),更蛋疼的是,我们的用户群体80%是不富裕的用户,他们手上的机器很多都是国内小厂的高系统版本低webview版本的机器(普遍安卓系统版本在7,8,但是webview效果形同安卓4.0左右)。
我们后来在其他浏览器App内运行了我们的页面,360浏览器无法获取视频流,百度可以正常运行,画面明亮,UC浏览器虽然视频流有时不能显示,但是截取到canvas的画面正常。
希望能离线打包集成指定的webview,至少在这种情况下能保证效果正常吧,虽然体积增加,但是也算是一种保底手段吧。

2019-03-29 19:36 负责人:无 分享
已邀请:
wsure

wsure (作者)

后续。。。摸索调用前置摄像头的component插件编写
周末回来,设计那边没有给出下一阶段的原型,抽空花了一天仔细研究了一下weex的component插件。
--
发现了component的特点:1.继承WXComponent<T> 在我这个外行看来,这里的T是一个View或者Layout。2.需要一个构造方法 3.需要复写protected T initComponentHostView(@NonNull Context context) 在这个方法里初始化你的视图。
--
然后研究有关Android相机预览的代码,发现大多使用SurfaceView,相机启动相关的代码也大同小异。贴上我参考的博客:
https://blog.csdn.net/yubo_725/article/details/50313489
--
这里最后,就这样瞎摸出一个插件
第一步,根据https://ask.dcloud.net.cn/article/35416配置好环境变量,新建一个Module作为插件,这里建议参考安卓离线打包:http://ask.dcloud.net.cn/article/508
直接在HBuilder-Hello项目里做,就别在UniPlugin-Hello-AS里面折腾了。

build.gradle配置仅供参考
需要注意的是compileSdkVersion 和targetSdkVersion 要与buildToolsVersion 相同,不然容易出现找不到style的那个错误,当然,如果你不报那个错,这个版本号随你喜欢就行


apply plugin: 'com.android.library'  

android {  
    compileSdkVersion 28  

    buildToolsVersion '28.0.3'  
    defaultConfig {  
        minSdkVersion 16  
        targetSdkVersion 28  
        versionCode 1  
        versionName "1.0"  

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"  

    }  

    buildTypes {  
        release {  
            minifyEnabled false  
            aaptOptions.cruncherEnabled = false  
            aaptOptions.useNewCruncher = false  
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
        }  
    }  

}  

dependencies {  
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])  

    compileOnly fileTree(dir: '../app/libs', include: ['uniapp-release.aar'])  

    compileOnly "com.android.support:recyclerview-v7:28.+"  
    compileOnly "com.android.support:support-v4:28.+"  
    compileOnly "com.android.support:appcompat-v7:28.+"  
    compileOnly 'com.taobao.android:weex_sdk:0.20.0.2'  
    compileOnly 'com.alibaba.android:bindingx-core:1.0.3'  
    compileOnly 'com.alibaba.android:bindingx_weex_plugin:1.0.3'  
}  
package top.wsure.frontcamera;  

import android.content.Context;  
import android.support.annotation.NonNull;  

import com.taobao.weex.WXSDKInstance;  
import com.taobao.weex.annotation.JSMethod;  
import com.taobao.weex.bridge.JSCallback;  
import com.taobao.weex.ui.action.BasicComponentData;  
import com.taobao.weex.ui.component.WXComponent;  
import com.taobao.weex.ui.component.WXVContainer;  

import java.util.HashMap;  
import java.util.Map;  

public class MyCameraComponent extends WXComponent<CameraView> {  
    public MyCameraComponent(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {  
        super(instance, parent, basicComponentData);  
        parent.getCSSLayoutTop();  
        parent.getCSSLayoutLeft();  
    }  

    public MyCameraComponent(WXSDKInstance instance, WXVContainer parent, int type, BasicComponentData basicComponentData) {  
        super(instance, parent, type, basicComponentData);  
    }  
    @Override  
    protected CameraView initComponentHostView(@NonNull Context context)  
    {  
        CameraView layout = new CameraView(context);  
        return layout;  
    }  

    //准备写一个获取当前图片的方法,qaq  
    @JSMethod  
    public void getData(JSCallback callback){  
        //Get the code for the location information .....  
        Map<String,String> data=new HashMap<>();  
        data.put("x","x");  
        data.put("y","y");  
        //notify once  
        callback.invoke(data);  
    }  
}  

其中的CameraView请参考博客里的,我只是删掉了一些方法并且把onPreviewFrame方法内清空了。
--
以上就是java代码。
AndroidManifest.xml内加入权限

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera2.full" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

这一步很关键,注册插件


{  
  "nativePlugins": [  
    {  
      "hooksClass": "",  
      "plugins": [  
        {  
          "type": "component",  
          "name": "ws-frontcamera",  
          "class": "top.wsure.frontcamera.MyCameraComponent"  
        }  
      ]  
    },  
    {  
      "hooksClass": "uni.dcloud.io.uniplugin_stepcounter.StepCounterHookProxy"  
    }  
  ]  
}

这个配置文件其实要点很简单,就是name,你这里填了什么,nvue里面的标签就叫什么。
至此,插件就ok了


下面开始试一下这个插件
随便找个项目,在一个已有页面的目录里新建一个nvue文件
内容随意
加入html
<ws-frontcamera class="card" ></ws-frontcamera>

加入css
.card{
width: 750upx;
height: 350upx;
}
然后生成本地打包文件,替换安卓项目里的,运行一下,很好,前置摄像头不再是黑乎乎的了

程咬金3斧头

程咬金3斧头

怒赞一个! 低配置手机上确实蛋疼,流畅性也差

DCloud_heavensoft

DCloud_heavensoft

欢迎提交到插件市场

溪鱼

溪鱼

请问,能把webview打包进去吗

言会咸

言会咸

你好,能给一份Android端和app的源代码吗?谢谢

1***@163.com

1***@163.com

ios可以从视频流获取人脸信息吗、

原生插件开发哦

原生插件开发哦 - 插件开发 | 个人接单 | 已上线多个原生插件| iOS+Android |插件定制| 主页 https://ask.dcloud.net.cn/question/91948

插件都可以实现的,有需要找我哦 Q 592944557
插件都可以实现的,有需要找我哦 Q 592944557

该问题目前已经被锁定, 无法添加新回复