Uni-app原生插件开发

1:下载AndroidStudio-Android 开发者  |  Android Developers

2:配置java环境-Windows配置java环境 - 冬首 - 博客园

3:去插件市场下载Uniapp提供的Demo-原生开发者支持

Android  Demo下载网盘地址:https://pan.baidu.com/s/1ZOzK_J7_xwxmiF8G0Vff-Q 
提取码:1006

码云下载地址:UniPlugin-Hello-AS: 1

下载后导入AndroidStudio

这个是他提供Demo里的Moudle

 当然,别忘了配置高德,不做过多解释

Android Studio-自动部署-创建工程-开发指南-Android 导航SDK | 高德地图API

修改高德key

最后编写完成要生成aar文件,我的Studio不知道是版本问题还是什么,和别人的不一样,无法像打包一样打成aar文件,但是可以在这里去切换release还是debug

先cleanProject,然后编译完成后再RebuildProject ,最终编译完成后

 这个就是咱们所需的aar文件

然后在Hbuilder中导入这个aar文件

红框圈住的是咱们去创建出来的,箭头所指的可以修改自己想要的名字 。

package.json这个文件是配置文件

{
    "name": "JFloatWindow",
    "id": "JFloatWindow",
    "version": "1.0.0",
    "description": "插件描述信息",
    "_dp_type":"nativeplugins",
    "_dp_nativeplugin":{
        "android": {
            "plugins": [
                {
                    "type": "component",
                    "name": "aMap",
                    "class": "io.dcloud.uniplugin.AMapNavigationView"
                },
                {
                    "type": "module",
                    "name": "address",
                    "class": "io.dcloud.uniplugin.AddressUniMdule"
                }
            ],
            "integrateType": "aar",
            "dependencies": [
                "com.amap.api:navi-3dmap:latest.integration",
                "com.amap.api:location:latest.integration"
            ],
            "compileOptions": {
                "sourceCompatibility": "1.8",
                "targetCompatibility": "1.8"
            },
            "minSdkVersion" : 21
        }
    }
}

这里我是提供了两种,一种是AndroidView,还有一种是只调用方法

View的用法

调用View里的方法 :

this.$refs.telText.startNavi(this.area);  

调用方法的用法:

 里面的address就是配置信息里的name

直接调用就可以了 

切记,要生成自定义基座,每次更换aar文件都需重新生成自定义基座

最后放上两个Adnroid  java类的代码:

public class AddressUniMdule extends UniModule {

    @UniJSMethod(uiThread = false)
    public String returnArea(String msg){
        


        JSONObject jsonObject1 = new JSONObject();

        JSONObject jsonObject = new JSONObject();


        try {
            jsonObject.put("verticalAccuracyMeters","");
            jsonObject.put("gpsAccuracyStatus","");
            jsonObject.put("time",String.valueOf(System.currentTimeMillis()));

            jsonObject.put("fromMockProvider","");
            jsonObject.put("elapsedRealtimeUncertaintyNanos","");
            jsonObject.put("district","");

            jsonObject.put("bearing","");
            jsonObject.put("address","");
            jsonObject.put("speedAccuracyMetersPerSecond","");

            jsonObject.put("conScenario","");
            jsonObject.put("poiName","");
            jsonObject.put("satellites","");

            jsonObject.put("longitude",AMapNavigationView.lon);
            jsonObject.put("street","");
            jsonObject.put("provider","");

            jsonObject.put("altitude","");
            jsonObject.put("road","");
            jsonObject.put("coordType","");

            jsonObject.put("locationDetail","");
            jsonObject.put("buildingId","");
            jsonObject.put("speed","");

            jsonObject.put("bearingAccuracyDegrees","");
            jsonObject.put("city","");
            jsonObject.put("province","");

            jsonObject.put("trustedLevel","");
            jsonObject.put("fixLastLocation","");
            jsonObject.put("offset","");

            jsonObject.put("errorInfo","");
            jsonObject.put("adCode","");
            jsonObject.put("streetNum","");

            jsonObject.put("description","");
            jsonObject.put("errorCode","");
            jsonObject.put("cityCode","");

            jsonObject.put("locationType","");
            jsonObject.put("latitude",AMapNavigationView.lat);
            jsonObject.put("mock","");

            jsonObject.put("elapsedRealtimeNanos","");
            jsonObject.put("accuracy","");
            jsonObject.put("complete","");

            jsonObject.put("country","");
            jsonObject.put("floor","");

            JSONObject object = new JSONObject();
            object.put("gPSStatusString","");
            object.put("gPSSatellites","");


            jsonObject1.put("gpsResult",object);
            jsonObject1.put("result",jsonObject);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        //Log.e("接受111",jsonObject.toString());
        return jsonObject1.toString();
    }

    @UniJSMethod(uiThread = false)
    public void openService(){
        Intent forgroundService = new Intent(mUniSDKInstance.getContext(),BackGroundService.class);
        mUniSDKInstance.getContext().startService(forgroundService);
    }

    @UniJSMethod(uiThread = false)
    public void stopService(){
        Intent forgroundService = new Intent(mUniSDKInstance.getContext(),BackGroundService.class);
        mUniSDKInstance.getContext().stopService(forgroundService);
    }

    @Override
    public void onActivityDestroy() {
        Intent forgroundService = new Intent(mUniSDKInstance.getContext(),BackGroundService.class);
        mUniSDKInstance.getContext().stopService(forgroundService);
        super.onActivityDestroy();

    }

public class AMapNavigationView extends UniComponent<AMapNaviView> {

    private AMapNaviView naviView;
    private AMapNavi aMapNavi;
    public static Double lat;
    public static Double lon;
    public String naviType = "0";   //0 正式导航   1: 模拟导航
    public AMapNavigationView(UniSDKInstance instance, AbsVContainer parent, AbsComponentData basicComponentData) {
        super(instance, parent, basicComponentData);
    }

    @Override
    protected AMapNaviView initComponentHostView(Context context) {
        naviView = new AMapNaviView(context);
        naviView.onCreate(new Bundle());
        return naviView;
    }

    @Override
    protected void onCreate() {
        super.onCreate();
    }

    @UniComponentProp(name = "area")
    public void setArea(String area) {
        Log.e("打印一下传来的值",area);

        JSONObject jsonObject = JSONObject.parseObject(area);
        Log.e("打印一下转换后的值",jsonObject.toString());
        String startLatitude = jsonObject.getString("startLatitude");
        String startLongitude = jsonObject.getString("startLongitude");
        String endLatitude = jsonObject.getString("endLatitude");
        String endLongitude = jsonObject.getString("endLongitude");

        if (null==jsonObject.getString("naviType")|| "".equals(jsonObject.getString("naviType"))){
            naviType = "0";
        }else {
            naviType = jsonObject.getString("naviType");
        }



        // 获取导航Manager
        aMapNavi = AMapNavi.getInstance(mUniSDKInstance.getContext());
        aMapNavi.setUseInnerVoice(true);
        // 起点信息
        List<NaviLatLng> startList = new ArrayList<NaviLatLng>();
        startList.add(new NaviLatLng(Float.parseFloat(startLatitude),Float.parseFloat(startLongitude)));
        // 终点信息
        List<NaviLatLng> endList = new ArrayList<NaviLatLng>();
        endList.add(new NaviLatLng(Float.parseFloat(endLatitude),Float.parseFloat(endLongitude)));
        // 经纬度算路
        aMapNavi.calculateDriveRoute(startList, endList, null, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);



        aMapNavi.addAMapNaviListener(new AMapNaviListener() {
            @Override
            public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
//返回路线成功 这里通过AMapCalcRouteResult绘制路线

                //获取RouteOverLay所需要的Amap 如果要把路线绘制到AMapNaviView 请获取AMapNaviView的Amap
                AMap aMap = naviView.getMap();

                //获取返回路线的数组routIDs aMapCalcRouteResult会返回一条或者多条路线。
                //ps:多条路线是用来做多路线选择的功能但是这里我们只做简单导航。所以我们只绘制一条。
                int[] routIds = aMapCalcRouteResult.getRouteid();
                int routeId = routIds[0];
                //通过routeId获取AMapNaviPath数据。

                AMapNaviPath aMapNaviPath = aMapNavi.getNaviPaths().get(routeId);
                //然后就可以创建RouteOverLay了
                RouteOverLay routeOverLay = new RouteOverLay(aMap, aMapNaviPath, mUniSDKInstance.getContext());


                //添加到AMapNaviView上。
                routeOverLay.addToMap();


                //绘制路线成功后。调用startNavi开始导航。
                //当然你也可以在别的地方调用  AMapNavi.startNavi(); //但是一定要在onCalculateRouteSuccess之后调用。
                if (naviType.equals("0")){
                    aMapNavi.startNavi(NaviType.GPS);
                }else {
                    aMapNavi.startNavi(NaviType.EMULATOR);
                }
            }
            public void onInitNaviFailure() {

            }

            public void onInitNaviSuccess() {

            }

            public void onStartNavi(int i) {

            }

            public void onTrafficStatusUpdate() {

            }

            public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
                lat = aMapNaviLocation.getCoord().getLatitude();
                lon = aMapNaviLocation.getCoord().getLongitude();

            }

            public void onGetNavigationText(int i, String s) {

            }

            public void onGetNavigationText(String s) {

            }

            public void onEndEmulatorNavi() {

            }

            public void onArriveDestination() {

            }

            public void onCalculateRouteFailure(int i) {

            }

            public void onReCalculateRouteForYaw() {

            }

            public void onReCalculateRouteForTrafficJam() {

            }

            public void onArrivedWayPoint(int i) {

            }

            public void onGpsOpenStatus(boolean b) {

            }

            public void onNaviInfoUpdate(NaviInfo naviInfo) {

            }

            public void updateCameraInfo(AMapNaviCameraInfo[] aMapNaviCameraInfos) {

            }

            public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) {

            }

            public void onServiceAreaUpdate(AMapServiceAreaInfo[] aMapServiceAreaInfos) {

            }

            public void showCross(AMapNaviCross aMapNaviCross) {

            }

            public void hideCross() {

            }

            public void showModeCross(AMapModelCross aMapModelCross) {

            }

            public void hideModeCross() {

            }

            public void showLaneInfo(AMapLaneInfo[] aMapLaneInfos, byte[] bytes, byte[] bytes1) {

            }

            public void showLaneInfo(AMapLaneInfo aMapLaneInfo) {

            }

            public void hideLaneInfo() {

            }

            public void onCalculateRouteSuccess(int[] ints) {

            }

            public void notifyParallelRoad(int i) {

            }

            public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {

            }

            public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {

            }

            public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {

            }

            public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {

            }

            public void onPlayRing(int i) {

            }

            @Override
            public void onCalculateRouteFailure(AMapCalcRouteResult aMapCalcRouteResult) {

            }

            @Override
            public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) {

            }

            @Override
            public void onGpsSignalWeak(boolean b) {
            }
        });
    }

    @UniJSMethod
    public void startNavi(String area){
        setArea(area);
    }

    @UniJSMethod
    public void stopNavi(String s) {
        Log.e("=====打印一下传来的值",s);
        aMapNavi.stopNavi();
    }



    @Override
    public void onActivityResume() {
        super.onActivityResume();
        aMapNavi.resumeNavi();
        Log.e("xxx","onActivityResume");
    }


    @Override
    public void onActivityStop() {
        super.onActivityStop();
        Log.e("xxx","onActivityStop");
    }

    @Override
    public void onActivityPause() {
        super.onActivityPause();
        Log.e("xxx","onActivityPause");
    }

    @Override
    public void onActivityDestroy() {
        super.onActivityDestroy();
        Log.e("xxx","onActivityDestroy");
        aMapNavi.stopNavi();
    }
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
uni-app中,可以通过原生插件来实现一些uni-app本身不支持的功能或者性能优化。下面是一个简单的uni-app原生插件的编写示例: 1. 创建一个uni-app项目,并选择需要封装的原生插件。 2. 在项目根目录下创建一个platforms目录,并在该目录下创建一个android和ios目录,用来存放对应平台的原生代码。 3. 在android目录下创建一个Android Studio项目,并将需要封装的原生插件添加到该项目中。 4. 在Android Studio中创建一个类,继承自com.dcloud.bridge.NativeAPI类,示例代码如下: ```java public class MyPlugin extends NativeAPI { public String sayHello(String name) { return "Hello " + name + "!"; } } ``` 5. 在Android Studio中创建一个类,继承自com.dcloud.bridge.Wrapper类,示例代码如下: ```java public class MyPluginWrapper extends Wrapper { public MyPluginWrapper(Context context) { super(context); } @Override public Object onMessage(String id, JSONObject data) { if (TextUtils.equals("sayHello", id)) { String name = data.optString("name"); MyPlugin myPlugin = new MyPlugin(); String result = myPlugin.sayHello(name); JSONObject json = new JSONObject(); try { json.put("result", result); } catch (JSONException e) { e.printStackTrace(); } return json; } return super.onMessage(id, data); } } ``` 6. 在Android Studio中创建一个类,继承自com.dcloud.bridge.Plugin类,示例代码如下: ```java public class MyPluginPackage extends PluginPackage { @Override public Wrapper createWrapper(Context context) { return new MyPluginWrapper(context); } } ``` 7. 在Android Studio中创建一个类,继承自com.dcloud.bridge.PluginManager类,示例代码如下: ```java public class MyPluginManager extends PluginManager { public MyPluginManager(Application application) { super(application); registerPackage("myplugin", new MyPluginPackage()); } } ``` 8. 修改AndroidManifest.xml文件,示例代码如下: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.uniappmyplugin"> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" /> <receiver android:name=".MyReceiver" /> <provider android:name=".MyProvider" /> <meta-data android:name="uniplugin" android:value="true" /> <meta-data android:name="uniplugin_name" android:value="myplugin" /> </application> </manifest> ``` 9. 在uni-app项目的manifest.json文件中添加以下代码: ```json "app-plus": { "android": { "useAndroidX": true, "permission": [ { "name": "android.permission.CAMERA", "desc": "摄像头权限", "def": "android.permission.CAMERA", "protectionLevel": "dangerous" } ], "gradleProperties": { "android.useAndroidX": true }, "dependencies": { "libs": [ { "path": "libs/xxx.aar" // xxx.aar为你的插件文件名 } ] } } } ``` 10. 在uni-app项目中调用插件方法,示例代码如下: ```javascript const plugin = uni.requireNativePlugin('myplugin') plugin.sayHello('world').then(res => { console.log(res.result) }).catch(err => { console.log(err) }) ``` 以上就是一个简单的uni-app原生插件的编写示例,具体实现方式可能会因插件需求而异。需要注意的是,uni-app原生插件开发需要具备一定的Android/iOS开发经验,如果你不熟悉原生开发,可以参考uni-app提供的插件市场,寻找已有的插件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值