zoukankan      html  css  js  c++  java
  • GJM:Unity导入百度地图SDK [转载]

    • 感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力以及转载收藏动力。欢迎转载!
    • 版权声明:本文原创发表于 【请点击连接前往】 ,未经作者同意必须保留此段声明!如有问题请联系我,侵立删,谢谢!
    • 我的博客:http://www.cnblogs.com/GJM6/  -  传送门:【点击前往

    Unity导入百度地图SDK

    本来以为很简单的接入SDK,断断续续弄了好久,基本看遍了国内外大大小小的网站,国内比较出名的两篇教程:第一个是雨松的:http://www.xuanyusong.com/archives/667
    第二个是这篇博客:http://stephen830.iteye.com/blog/2088504
    参考上述两篇,其中流程和做法基本都是正确的,只是原理和细节还是没有说清楚,导致很多人接入SDK时纸质其然而不知其所以然,所以我还是把我这一个星期踩过的坑都记录下来,希望下次遇到同样的问题有个参考。


    这篇文章最后实现的功能:打开应用后首先出现的场景,点击场景中的一个Button按钮后弹出百度地图界面。


    Eclipse环境搭建等见上一篇文章:
    使用Eclipse导入SDK遇到的问题总结:http://anchorart9.com/2016/10/23/androidsdksubmit/


    今天这篇文章主要讲两块配置:AndroidUnity.
    1.Android方面配置(我选用的是Eclipse
    1)首先建立安卓工程,这里注意的是minimum Required SDK应该选用4.0不然后面会报错。

    2)复制百度地图SDK下的libs文件夹(注意这里两篇文章都说要导入Unity的Class.jar,其实是看需求的,我用了一个中间层来专门写接口,所以暂时不用UnityPlayerActivity这个类)复制进来后如下图:这里特别注意:把v8ax86_64两个文件夹删掉,不然到Unity里会报错,三个文件夹名字分别代表不同手机的CPU类型,x86_64是代表64的平板。



    3)写两个类,一个中间层类【MainActivity】用来写接口调用百度地图的Activity,一个是百度地图的类继承Activity,因为这个是百度地图的界面类,遵循Activity的生命周期,要在onCreat钩子方法中初始化百度地图界面。[mw_shl_code=java,true]package com.baidulbs.lbssdk;


    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.Toast;
    public class MainActivity {


        private static Context unityContext;
        private static Activity unityActivity;
        
       //init方法,用来传入上下文    
        public static void init(Context paramContext){
      unityContext = paramContext.getApplicationContext();
      unityActivity = (Activity) paramContext;
        }
      public static void StartActivity0()    {   
      // TODO Auto-generated method stub
        
        unityActivity.runOnUiThread(new Runnable()
      {    
       public void run()    
       {    
      try{
        Log.i("startA", "startActivity0");
        Intent intent = new Intent(unityActivity,BaiduMap.class);    
       unityActivity.startActivity(intent);
      }
      catch (Exception e) {
      e.printStackTrace();
        
        }
       }
      });
        }
    }
    [/mw_shl_code]


    [mw_shl_code=java,true]package com.baidulbs.lbssdk;


    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.MapView;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;


    public class BaiduMap extends Activity {
      MapView mMapView = null; 
        @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      
        Log.i("BaiduActivityTest", "进入了");
        SDKInitializer.initialize(getApplicationContext());
        Log.i("BaiduActivityTest", "初始化完成");
        setContentView(R.layout.activity_main); 
        Log.i("BaiduActivityTest", "设置面板完成");
        mMapView = (MapView) findViewById(R.id.bmapView);
        Log.i("BaiduActivityTest", "初始化地图完成");
       }
    }[/mw_shl_code]

    注意写几个Log方便查看Logcat,之前一直用ADB查看日志发现很多log不详细,比如window弹不出来它就只报WindowChangeFales.



    4)配置AndroidManifest.xml,这里注意:改成你的包名,并添加BaiduMap这个Activity,还有你自己的Key和一些权限,还要注意将UnityActivity设置为主启动,雨松的博客以及他的衍生博客均是把继承了UnityPlayerActivityMainActivity设置为主启动,然后也不加UnityAcitivity直接就复制进UnityPlugins-Android目录了,这样导致的后果就是先启动Android界面了。我这里之所以没有加入MainActivity是因为他只不过充当一个中间层,也没有继承Activity,只有BaiduMap这个类是继承Activity的。这里不要只抄雨松他们的博客,要知道你自己的需求和原理,他们也都是提供参考和引导。
    [mw_shl_code=applescript,true]<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.baidulbs.lbssdk"
        android:versi"1"
        android:versi"1.0" >


        <uses-sdk
      android:minSdkVersion="14"
      android:targetSdkVersion="25" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
      <uses-permission android:name="android.permission.WAKE_LOCK"/>
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
      <uses-permission android:name="android.permission.GET_TASKS" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.WRITE_SETTINGS" />


        <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
       <meta-data
      android:name="com.baidu.lbsapi.API_KEY"
      android:value="你的Key" /> 
      <activity  
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
       android:name="com.baidulbs.lbssdk.BaiduMap">    
      </activity> 
        <activity
       android:name="com.unity3d.player.UnityPlayerActivity">
       <intent-filter>
        <action android:name="android.intent.action.MAIN" />


        <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
       <meta-data
       android:name="unityplayer.ForwardNativeEventsToDalvik"
       android:value="true" /> 
      </activity>  
        </application>
        
    </manifest>[/mw_shl_code]
    5)导处jar包,直接右键项目-Export-Next,直选中scr文件夹,然后导出就行了,好多博客在这里讲的都很乱。




    至此Android这块的配置全部结束。

    2.Unity方面配置
    1)将Android工程中的libs+res+AndroidManifest+百度地图Demo中的assets(有朋友开发到后面因为每加这个包出错)都复制到Unity目录下,建立bin文件夹,将打包好的.jar文件复制到bin文件夹下:


    2)在Unity中编辑测试代码:
    [mw_shl_code=csharp,true]using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;


    public class Test : MonoBehaviour {
       // Update is called once per frame
        public Button btnStartLBS;
        public Button btnStartLBSMap;


        AndroidJavaClass unityPlayer;
        AndroidJavaObject currentActivity;
        AndroidJavaClass androidCall;
        void Start()
        {
      //获取context
      unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");


      androidCall = new AndroidJavaClass("com.baidulbs.lbssdk.MainActivity");
      androidCall.CallStatic("init", currentActivity);


       
      btnStartLBS.onClick.AddListener(BtnStartLBSOnClick);
      btnStartLBSMap.onClick.AddListener(BtnStartLBSMapOnClick);
      
        }
      void Update ()
      {
        //当用户按下手机的返回键或home键退出游戏
        if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) )
       {
       Application.Quit();
       }
      }

        void BtnStartLBSMapOnClick()
        {
      androidCall.CallStatic("StartActivity0");


      Debug.Log("2");
        }
    }[/mw_shl_code]
    3)发布这里要把包名与你Android项目中包名一致。


    4)勾上Development Build然后Build and Run.这时你需要连上真机进行测试在Eclipse中打开Logcat就可以查看Log日志了,要查看自己设置的Log可以在左边添加Filter,在里面添加自己的Tag,例如我之前卡在初始化这里,也可以在AndroidSDK-platform-tools目录下使用命令:adb logcat -s Unity进行调试(这种方法显示信息不全建议还是用Eclipse调试)。


    5)最终效果:点击按钮后跳转到百度地图界面。


    原文链接:http://anchorart9.com/2016/11/13/unity%E6%8E%A5%E5%85%A5%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BEsdk/

  • 相关阅读:
    [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用)-布布扣-bubuko.com
    给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today
    命令行选项
    SQL 优化
    精通initramfs构建step by step
    常用正则表达式
    Chrome_浏览器开发人员工具
    按键精灵
    CMD命令大全
    50种折纸方法
  • 原文地址:https://www.cnblogs.com/TDou/p/6150113.html
Copyright © 2011-2022 走看看