百度地图室内地图及方向传感器实现

时间:2024-05-23 17:26:42

1、添加室内图开关的按钮

    在布局文件中添加如下代码:

 <Button
        android:id="@+id/isIndoor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:text="室内图开关"
        tools:layout_editor_absoluteX="301dp"
        tools:layout_editor_absoluteY="26dp"
        />

   默认开启室内图

        mBaiduMap.setIndoorEnable(true);

  设置按钮的点击事件

 isIndoorBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isIndoor) {
                    EnableIndoorMap();
                } else {
                    DisableIndoorMap();
                }
                isIndoor = !isIndoor;
            }
        });

EnableIndoorMap()方法

   private void EnableIndoorMap() {
        mbaiduMap.setIndoorEnable(true);
        isIndoorBtn.setText("关闭室内图");
        Toast.makeText(MainActivity.this, "室内图已打开", Toast.LENGTH_SHORT).show();
    }

DisEnableIndoorMap() 方法

  private void DisableIndoorMap() {
        if (null != mIndoorRoutelineOverlay) {
            mIndoorRoutelineOverlay.removeFromMap();
            mIndoorRoutelineOverlay = null;
        }
        mbaiduMap.clear();
        mbaiduMap.setIndoorEnable(false);
        isIndoorBtn.setText("打开室内图");

        Toast.makeText(MainActivity.this, "室内图已关闭", Toast.LENGTH_SHORT).show();
    }

注:IndoorRoutelineOverlay类相关的代码在官方的demo中有,直接复制过来即可

百度地图室内地图及方向传感器实现

  设置监听事件来监听进入和移出室内图

  

  mbaiduMap.setOnBaseIndoorMapListener(new BaiduMap.OnBaseIndoorMapListener() {
            @Override
            public void onBaseIndoorMapMode(boolean b, MapBaseIndoorMapInfo mapBaseIndoorMapInfo) {
                if (b == false || mapBaseIndoorMapInfo == null) {
                    stripListView.setVisibility(View.INVISIBLE);
                    return;
                }
                mFloorListAdapter.setmFloorList( mapBaseIndoorMapInfo.getFloors());
                stripListView.setVisibility(View.VISIBLE);
                stripListView.setStripAdapter(mFloorListAdapter);
                mMapBaseIndoorMapInfo = mapBaseIndoorMapInfo;
            }
        });

添加楼层信息

stripListView = new StripListView(this);
        layout.addView(stripListView);
        setContentView(layout);
        mFloorListAdapter = new BaseStripAdapter(MainActivity.this);

实现楼层间地图切换,展示不同楼层的室内图

  stripListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                if (mMapBaseIndoorMapInfo == null) {
                    return;
                }
                // 切换楼层信息
                //strID 通过 mMapBaseIndoorMapInfo.getID()方法获得
                String floor = (String) mFloorListAdapter.getItem(position);
                mbaiduMap.switchBaseIndoorMapFloor(floor, mMapBaseIndoorMapInfo.getID());
                mFloorListAdapter.setSelectedPostion(position);
                mFloorListAdapter.notifyDataSetInvalidated();
            }
        });

然后运行工程,室内图已经出现了,如图:

并且可以成功切换楼层

百度地图室内地图及方向传感器实现

 

2、方向传感器的实现

新建MyOrientationListener用来负责定位图标与方向传感器相结合

public class MyOrientationListener implements SensorEventListener {
    private SensorManager mSensorManager;
    private Context context;
    private Sensor mSensor;// 传感器

    private float lastX;

    public MyOrientationListener(Context context) {
        this.context = context;
    }

    // 开启监听
    @SuppressWarnings("deprecation")
    public void start() {
        //获得系统服务
        mSensorManager=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        if(mSensorManager!=null){
            //获得方向传感器
            mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        }
        if(mSensor!=null){
            mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_UI);//第三个参数为经度
        }
    }

    // 结束监听
    public void stop() {
        //停止定位
        mSensorManager.unregisterListener(this);
    }

    // 经度发生改变时
    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {

    }

    // 纬度发生改变时
    @Override
    public void onSensorChanged(SensorEvent event) {
        //如果事件返回的类型是方向传感器
        if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){
            float x=event.values[SensorManager.DATA_X];
            //如果变化大于一度
            if(Math.abs(x-lastX)>1.0){
                //通知主界面进行回掉
                if(mOnOrientationListener!=null){
                    mOnOrientationListener.onOrientationChanged(x);
                }
            }
            lastX=x;
        }
    }


    private OnOrientationListener mOnOrientationListener;

    public void setmOnOrientationListener(
            OnOrientationListener mOnOrientationListener) {
        this.mOnOrientationListener = mOnOrientationListener;
    }

    //回掉接口
    public interface OnOrientationListener{
        void onOrientationChanged(float x);
    }

}

初始化方向传感器

 private void initOritationListener()
    {
        myOrientationListener = new MyOrientationListener(
                getApplicationContext());
        myOrientationListener
                .setmOnOrientationListener(new MyOrientationListener.OnOrientationListener()
                {
                    @Override
                    public void onOrientationChanged(float x)
                    {
                        mCurrentX = (int) x;

                        // 构造定位数据
                        MyLocationData locData = new MyLocationData.Builder()
                                .accuracy(mCurrentAccracy)
                                // 此处设置开发者获取到的方向信息,顺时针0-360
                                .direction(mCurrentX)
                                .latitude(mCurrentLantitude)
                                .longitude(mCurrentLongitude).build();
                        // 设置定位数据
                        mbaiduMap.setMyLocationData(locData);
                        // 设置自定义图标
//                        BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
//                                .fromResource(R.mipmap.navi_map_gps_locked);
                        MyLocationConfiguration config = new MyLocationConfiguration(
                                MyLocationConfiguration.LocationMode.NORMAL, true, null);
                        mbaiduMap.setMyLocationConfigeration(config);

                    }
                });
    }

重载Onstart()和OnStop()方法

 @Override
    protected void onStart() {
        super.onStart();
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        //开启定位的允许
        mbaiduMap.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
            //开启方向传感器
            myOrientationListener.start();
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        //关闭定位
        mbaiduMap.setMyLocationEnabled(false);
        mLocationClient.stop();
        //停止方向传感器
        myOrientationListener.stop();
        //client.disconnect();

    }

最终效果如图:

百度地图室内地图及方向传感器实现