zoukankan      html  css  js  c++  java
  • HBuilder第三方插件开发(Android平台openinstall集成)

    开发插件

    编写 Android 原生代码

    下载 openinstall SDK 并将 jar 包拷贝到项目的 libs 目录。创建一个 package,如 com.wenkiwu.hbuilder.openinstall;在包中新建一个类继承自 StandardFeature,然后对应openinstall的接口定义相应的功能方法。完整代码如下:

    package com.wenkiwu.hbuilder.openinstall;
    
    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    
    import com.fm.openinstall.OpenInstall;
    import com.fm.openinstall.listener.AppInstallAdapter;
    import com.fm.openinstall.listener.AppWakeUpAdapter;
    import com.fm.openinstall.model.AppData;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import io.dcloud.common.DHInterface.ISysEventListener;
    import io.dcloud.common.DHInterface.IWebview;
    import io.dcloud.common.DHInterface.StandardFeature;
    import io.dcloud.common.util.JSUtil;
    
    public class OpenInstallApiManager extends StandardFeature {
    
        private static final String TAG = "OpenInstallApiManager";
        private IWebview webview = null;
        private String wakeupCallBackID = null;
    
        @Override
        public void onStart(Context context, Bundle bundle, String[] strings) {
            super.onStart(context, bundle, strings);
            Log.d(TAG, "init");
            OpenInstall.init(context);
        }
    
        public void registerWakeUpHandler(final IWebview pWebview, JSONArray array) {
            Log.d(TAG, "registerWakeUpHandler");
            String callBackID = array.optString(0);
    
            webview = pWebview;
            wakeupCallBackID = callBackID;
            // 自己注册监听并处理 onNewIntent 事件
            pWebview.obtainApp().registerSysEventListener(new ISysEventListener() {
                @Override
                public boolean onExecute(SysEventType sysEventType, Object o) {
                    if (sysEventType == SysEventType.onNewIntent) {
                        String dataString = (String) o;
                        Intent intent = new Intent();
                        intent.setData(Uri.parse(dataString));
                        if (webview != null && wakeupCallBackID != null) {
                            getWakeUp(intent, webview, wakeupCallBackID);
                        }
                    }
                    return false;
                }
            }, SysEventType.onNewIntent);
    
            Intent intent = pWebview.getActivity().getIntent();
            if (intent == null || TextUtils.isEmpty(intent.getDataString())) {
                return;
            }
            getWakeUp(intent, pWebview, callBackID);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            // 5+sdk 的 bug 导致 onNewIntent 未被回调
    //        if (webview != null && wakeupCallBackID != null) {
    //            getWakeUp(intent, webview, wakeupCallBackID);
    //        }
        }
    
        private void getWakeUp(Intent intent, final IWebview pWebview, final String callBackID) {
            OpenInstall.getWakeUp(intent, new AppWakeUpAdapter() {
                @Override
                public void onWakeUp(AppData appData) {
                    JSONObject dataJson = new JSONObject();
                    try {
                        dataJson.put("channelCode", appData.getChannel());
                        dataJson.put("bindData", appData.getData());
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    JSUtil.execCallback(pWebview, callBackID, dataJson, JSUtil.OK, false);
                }
            });
        }
    
        public void getInstall(final IWebview pWebview, JSONArray array) {
            Log.d(TAG, "getInstall");
            final String callBackID = array.optString(0);
            int timeout = -1;
            if (array.isNull(1)) {
                timeout = array.optInt(1);
            }
            OpenInstall.getInstall(new AppInstallAdapter() {
                @Override
                public void onInstall(AppData appData) {
                    JSONObject dataJson = new JSONObject();
                    try {
                        dataJson.put("channelCode", appData.getChannel());
                        dataJson.put("bindData", appData.getData());
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    JSUtil.execCallback(pWebview, callBackID, dataJson, JSUtil.OK, false);
                }
            }, timeout * 1000);
        }
    
        public void reportRegister(IWebview pWebview, JSONArray array) {
            Log.d(TAG, "reportRegister");
            OpenInstall.reportRegister();
        }
    
        public void reportEffectPoint(IWebview pWebview, JSONArray array) {
            Log.d(TAG, "reportEffectPoint");
            String pointId = array.optString(0);
            long pointValue = array.optLong(1);
            OpenInstall.reportEffectPoint(pointId, pointValue);
        }
    
    }
    

    封装插件的 JS

    在前端代码的 js 文件夹中,新建 openinstall.js,编写代码,通过 plus.bridge 调用 Native 层的方法

    document.addEventListener( "plusready",  function(){
        var _BARCODE = 'openinstall',
    		B = window.plus.bridge;
        var openinstall = {
            //注册拉起回调
            registerWakeUpHandler: function (successCallback) {
                var success = typeof successCallback !== 'function' ? null : function(args) {
                    successCallback(args);
                },
                callbackID = B.callbackId(success, null);
                return B.exec(_BARCODE, "registerWakeUpHandler", [callbackID]);
            },
            // 获取安装来源数据
            getInstall : function (successCallback, timeout) {
                var success = typeof successCallback !== 'function' ? null : function(args) {
                    successCallback(args);
                },
                callbackID = B.callbackId(success, null);
                return B.exec(_BARCODE, "getInstall", [callbackID, timeout]);
            },
            // 注册上报
            reportRegister : function () {
                return B.exec(_BARCODE, "reportRegister", []);
            },
            // 上报渠道效果
            reportEffectPoint : function (pointId, pointValue) {
                return B.exec(_BARCODE, "reportEffectPoint", [pointId, pointValue]);
            }
        };
        window.plus.openinstall = openinstall;
    }, true );
    

    集成插件

    关联 JS 插件名和 Android 原生类

    修改项目的 src/main/assets/data/ 目录下的 dcloud_properties.xml文件,指定 JS 对象名称和 Android 的类名对应关系,以便 H5+ SDK 根据对应的 JS 名查找并生成相应的 Native 对象执行对应的逻辑

    <properties>
        <features>
            <!-- more feature -->
    
            <!-- openinstall plugin -->
            <feature name="openinstall" value="com.wenkiwu.hbuilder.openinstall.OpenInstallApiManager"/>
        </features>
    
        <services>
            <!-- openinstall需要在程序启动时初始化 -->
            <service name="openinstall" value="com.wenkiwu.hbuilder.openinstall.OpenInstallApiManager"/>
            <!-- more service -->
        </services>
    </properties>
    

    在应用的 manifest.json 文件中还需要添加扩展插件的应用使用权限

    {
      "@platforms": [
        "android",
        "iPhone",
        "iPad"
      ],
      "id": "H5E1BA598",
      "name": "OpenInstallPlugin",
      // ...
      "permissions": {
        "Console": {
          "description": "跟踪调试输出日志"
        },
        "Events": {
          "description": "应用扩展事件"
        },
        // openinstall plugin
        "openinstall": {
          "description": "openinstall插件"
        }
      },
      // ...
    }
    

    openinstall 的配置

    根据openinstall官方文档,在 AndroidManifest.xml 中做以下配置

    声明权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    

    配置 AppKey 和 scheme

    <application
        android:allowBackup="false"
        android:allowClearUserData="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true">
        <!-- openinstall appkey 配置 -->
        <meta-data
            android:name="com.openinstall.APP_KEY"
            android:value="OPENINSTALL_APPKEY"/>
    
        <activity
            android:name="io.dcloud.PandoraEntry"
            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale"
            android:hardwareAccelerated="true"
            android:screenOrientation="user"
            android:theme="@style/TranslucentTheme"
            android:launchMode="singleTask"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
    
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <!-- opeinstall scheme 配置 -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
    
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
    
                <data android:scheme="OPENINSTALL_SCHEME"/>
            </intent-filter>
        </activity>
    </application>
    

    网页中 JS 调用示例

    引入 JS 文件
    <script type="text/javascript" src="./js/openinstall.js"></script>
    
    获取 scheme 唤醒数据

    在应用启动时,注册唤醒回调。这样当 App 被唤醒时,会回调传入的方法,并在回调中获取唤醒数据

    document.addEventListener('plusready',function(){
        plus.openinstall.registerWakeUpHandler(function(data){
                    console.log("wakeup : channelCode= "
                        + data.channelCode + ", bindData=" + data.bindData);
                    alert("wakeup : channelCode= " + data.channelCode + ", bindData=" + data.bindData);
                });
    
    },false);
    
    获取安装来源数据

    在需要获取安装来源数据时,调用以下代码,在回调中获取参数

    function getInstall(){
        plus.openinstall.getInstall(function(data){
            console.log("getInstall : channelCode= "
                    + data.channelCode + ", bindData=" + data.bindData);
        }, 8);
    }
    
    其他统计代码

    用户注册成功后,调用以下代码,上报注册统计

    function reportRegister(){
        plus.openinstall.reportRegister();
    }
    

    统计终端用户对某些特殊业务的使用效果,如充值金额,分享次数等等,调用以下代码

    function reportEffectPoint(){
        plus.openinstall.reportEffectPoint("effect_test", 1);
    }
    

    **openinstall 官方已提供 hbuilder 集成插件 [openinstall-hbuilder-sdk](https://github.com/OpenInstall/openinstall-hbuilder-sdk),包含了iOS和Android两个平台**
  • 相关阅读:
    Homestead 安装其它的PHP版本
    Angular调用父Scope的函数
    检测到在集成的托管管道模式下不适用的ASP.NET设置
    IE8不能保存cookie,造成response.redirect死循环的原因
    IE浏览器“自定义安全级别”不能设置的原因
    测试sql server服务是否配置正确
    Sql Server Express 2005提示"failed to generate a user instance of sql server "
    cordova使用Gradle构建下载maven太慢,使用阿里云镜像
    使用Cordova编译Android平台程序提示:Could not reserve enough space for 2097152KB object heap
    Angular动态编译Html
  • 原文地址:https://www.cnblogs.com/wenhui92/p/9052308.html
Copyright © 2011-2022 走看看