unity对接百度地图(显示地图和自身位置)

我是将unity工程导出为android工程,将定位脚本和需要的jar包依赖等加入,如下
LocationCustomDemo

package com.baidu.map.demo.layers;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.map.R;
import com.baidu.map.UnityPlayerActivity;
import com.baidu.map.demo.PermissionUtils;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.Permission;

/**
 * 展示定位图层自定义样式
 */
public class LocationCustomDemo extends Activity {

    private static final String TAG = "unity";
    private LocationClient mLocClient;
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    // 是否首次定位
    boolean isFirstLoc = true;
    private BitmapDescriptor bitmapA;
    private Marker mMarker;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_locationcustom);
        // 地图初始化
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_monster);
        checkPermissions();

        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                Toast.makeText(LocationCustomDemo.this,"点击Marker图标", Toast.LENGTH_SHORT).show();
                // 点击maker之后跳转回unity界面
                Intent intent = new Intent(LocationCustomDemo.this, UnityPlayerActivity.class);
                startActivity(intent);
                return true;
            }
        });
    }

    /**
     * 获取权限
     */
    private void checkPermissions() {
        PermissionUtils.applicationPermissions(this, new PermissionUtils.PermissionListener() {
            @Override
            public void onSuccess(Context context) {
                // 定位初始化
                initLocation();
            }

            @Override
            public void onFailed(Context context) {
                if (AndPermission.hasAlwaysDeniedPermission(context, Permission.Group.LOCATION)
                        && AndPermission.hasAlwaysDeniedPermission(context, Permission.Group.STORAGE)) {
                    AndPermission.with(context).runtime().setting().start();
                }
                Toast.makeText(context, "文件读取权限或相机权限被禁用,请前往权限管理设置文件读取或相机权限", Toast.LENGTH_SHORT);
                finish();
            }
        }, Permission.Group.STORAGE, Permission.Group.LOCATION);

    }
    /**
     * 定位初始化
     */
    public void initLocation(){

        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        // 定位初始化
        mLocClient = new LocationClient(this);
        MyLocationListenner myListener = new MyLocationListenner();
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        // 打开gps
        option.setOpenGps(true);
        // 设置坐标类型
        option.setCoorType("bd09ll");
        option.setScanSpan(1000);
        mLocClient.setLocOption(option);
        mLocClient.start();
    }

    /**
     * 添加marker
     *
     * @param latLng 经纬度
     */
    public void addMarker(LatLng latLng){
        if (latLng.latitude == 0.0 || latLng.longitude == 0.0){
            return;
        }
        MarkerOptions markerOptionsA = new MarkerOptions().position(latLng).yOffset(30).icon(bitmapA).draggable(true);
        Log.d(TAG, "设置maker");
        mMarker = (Marker) mBaiduMap.addOverlay(markerOptionsA);
//        Log.d(TAG, "maker坐标"+mMarker.getPosition());
    }

    /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner  extends BDAbstractLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // MapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            if (isFirstLoc) {
                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
                MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(latLng);
                mBaiduMap.animateMapStatus(update);
                isFirstLoc = false;
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(latLng).zoom(20.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
                addMarker(latLng);
            }

            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())// 设置定位数据的精度信息,单位:米
                    .direction(location.getDirection()) // 此处设置开发者获取到的方向信息,顺时针0-360
                    .latitude(location.getLatitude())
                    .longitude(location.getLongitude())
                    .build();
            // 设置定位数据, 只有先允许定位图层后设置数据才会生效
            mBaiduMap.setMyLocationData(locData);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在activity执行onResume时必须调用mMapView. onResume ()
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 在activity执行onPause时必须调用mMapView. onPause ()
        mMapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        bitmapA.recycle();
        // 退出时销毁定位
        mLocClient.stop();
        // 关闭定位图层
        mBaiduMap.setMyLocationEnabled(false);
        // 在activity执行onDestroy时必须调用mMapView.onDestroy()
        mMapView.onDestroy();
    }
}

因为我是unity对接,所以在UnityPlayerActivity下加入

	// 这个名字随便起的,自己根据unity方法改
	 public  void ShowToast()
    {
        startActivity(new Intent(this, LocationCustomDemo.class));
    }

DemoApplication

public class DemoApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
        // 默认本地个性化地图初始化方法
        SDKInitializer.initialize(this);

        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

因为我在LocationCustomDemo中申请权限用了AndPermission,代码不放了,可以去这里

activity_locationcustom

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/btn_selector"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioGroup
            android:id="@+id/radioGroup"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@color/dkgray"
            android:contentDescription="定位icon"
            android:orientation="horizontal">
        </RadioGroup>

    </LinearLayout>
    
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" >

    </com.baidu.mapapi.map.MapView>
</LinearLayout>

AndroidManifest 有些配置是unity自带的
注意application的android:name=".BaiduMap.DemoApplication",如果不加这个会报错
Error inflating class com.baidu.mapapi.map.MapView

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.baidu.map"
    android:installLocation="preferExternal">

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-feature android:glEsVersion="0x00020000" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen.multitouch"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen.multitouch.distinct"
        android:required="false" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:name=".BaiduMap.DemoApplication"
        android:theme="@style/UnityThemeSelector">
        <activity
            android:name=".UnityPlayerActivity"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
            android:hardwareAccelerated="false"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="fullSensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
            <meta-data
                android:name="android.notch_support"
                android:value="true" />
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="你的KEY" />
        </activity>
        <meta-data
            android:name="unity.build-id"
            android:value="ccbf816c-d1a9-495b-80e6-9ed8063ef964" />
        <meta-data
            android:name="unity.splash-mode"
            android:value="0" />
        <meta-data
            android:name="unity.splash-enable"
            android:value="True" />
        <meta-data
            android:name="notch.config"
            android:value="portrait|landscape" />
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />
        <activity android:name=".demo.layers.LocationCustomDemo" />
    </application>

</manifest>

不要忘了在build.gradle下加入下面这个,否则会报错
No implementation found for int com.baidu.mapsdkplatform.comjni.tools.JNITools.initClass (java.lang.Object, int)

   sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }

还有百度地图需要的库,可以自己去官网下地图需要的库即可,这里我就不放出来了
在这里插入图片描述

记 : 定位定到几内亚或者地球经纬度的另一端是因为鉴权错误,确认AK和应用包名是否匹配,然后看下鉴权信息把应用的sha1码改成鉴权信息上的sha1码即可

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Unity是一款跨平台的游戏引擎,可以用来开发各种类型的游戏和应用程序。Android Studio是一个专门用于开发Android应用程序的集成开发环境(IDE),提供了丰富的工具和功能来帮助开发人员创建高质量的Android应用程序。百度地图是一款基于位置服务的地图应用,可以提供定位、导航、交通状况等功能。 使用Unity和Android Studio结合起来开发应用程序,可以充分发挥两者的优势。Unity可以用来创建游戏场景、物体和特效,可以方便地进行游戏逻辑和交互设计。而Android Studio则可以用来编写Android应用的Java代码,进行应用程序的逻辑开发和界面设计。通过结合使用Unity和Android Studio,开发人员可以实现更复杂、更丰富的应用程序。 百度地图提供了丰富的API和SDK,可以方便地在Unity和Android Studio中集成使用。通过百度地图的API和SDK,开发人员可以在应用程序中添加地图显示、定位、搜索、导航等功能。例如,可以在Unity中创建一个游戏场景,然后使用百度地图的SDK将地图显示在场景中。同时,可以使用百度地图的API获取用户的位置信息,实现定位功能。还可以使用百度地图的搜索功能,让用户可以在应用程序中搜索地点,并进行导航。 总之,将Unity、Android Studio和百度地图结合起来使用,可以实现更丰富、更具交互性的应用程序开发。无论是游戏还是其他类型的应用,这种结合可以提供更好的用户体验和更多的功能选择。 ### 回答2: Unity是一款跨平台的游戏引擎,而Android Studio则是一款集成开发环境(IDE),用于开发安卓应用程序。而百度地图是一款提供地理位置和导航服务的应用程序接口(API)。 Unity和Android Studio可以结合使用来开发基于地图的游戏和应用。在Unity中,我们可以使用Unity的内置功能和插件来创建一个虚拟的游戏世界,并将百度地图的数据集成到游戏中。例如,在一个虚拟城市的游戏中,我们可以使用百度地图的API来获取真实世界的建筑和道路信息,并将其添加到游戏世界中,以增强游戏的逼真感。 Android Studio作为一个强大的开发工具,可以用于开发基于百度地图的安卓应用。我们可以使用Android Studio的界面设计工具和编码功能来构建一个用户友好的应用程序,并使用百度地图的API来获取用户位置显示地图和提供导航功能。例如,我们可以开发一个实时公交查询应用,在用户身边显示附近的公交站点和实时公交车位置,并提供路线规划和导航功能。 总之,Unity和Android Studio是两个强大的工具,可以与百度地图API结合使用,来开发出有趣、实用的地图相关的游戏和应用程序。通过充分发挥它们的优势,我们可以创造出更好的用户体验和更丰富的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值