Flutter与Native交互(Android百度地图与Flutter交互实战)(1)

body: Stack(
children: [
Center(
child: AndroidView(viewType: ‘MyMap’),
),
],
));
}

@override
bool get wantKeepAlive => true;
}

Android端代码

怎么配置baidu地图的sdk这里就不细说了,baidu地图的文档给开发者提供了相当详细的说明,在代码里面主要看中MethodChannel和EventChannel的功能,MethodChannel可以通过MethodCall监听Flutter程序事件发来的事件的数据,然后可以通过EventChannel进行发送数据回去,两者结合再一起则是双通道的通信机制。这里发送的数据格式有要求,格式如下(官网图片)

MainActivity.java

com.example.my_project

import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
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.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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.UiSettings;
import com.baidu.mapapi.model.LatLng;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;

import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
private final String eventString = “event”;
private static final String TAG = “MainActivity”;
private static final String CHANNEL = “samples.flutter.io/getLocation”;
private static final String eventChannel = “com.example.my_project/event”;
private MethodChannel channel;
// 后台服务器地址
String host = null;

String locationText;
Double longitude, latitude;
static User user = new User(“”, “”);

private static MapView mapView;
private static BaiduMap mBaiduMap;
private LocationClient mLocationClient;
private static String myId = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
mapView = new MapView(this);
MapRegistrant.registerWith(this, mapView);

//定位初始化
mLocationClient = new LocationClient(this);
//注册LocationListener监听器
MyLocationListener myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);

// 不显示百度地图Logo
mapView.removeViewAt(1);
mBaiduMap = mapView.getMap();
// 改变地图状态,使地图显示在恰当的缩放大小
mMapStatus = new MapStatus.Builder().zoom(18.0f).build();
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);
mBaiduMap.setMyLocationEnabled(true);

mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.FOLLOWING, true, null));

//实例化UiSettings类对象
UiSettings mUiSettings = mBaiduMap.getUiSettings();
//禁用地图旋转功能,启用后对显示屏幕范围内的Marker有一定影响
mUiSettings.setRotateGesturesEnabled(false);
//禁用地图俯视功能
mUiSettings.setOverlookingGesturesEnabled(false);

new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
// 在这个回调里处理从Flutter来的调用
switch (call.method) {
case “getLocationDics”:
if (locationText == “”) {
result.success(“地球的某一个角落”);
break;
}
result.success(locationText);
break;
case “getLocationLongitude”:
result.success(longitude);
break;
case “getLocationLatitue”:
result.success(latitude);
break;
case “refrashMap”:
if (user.getUserId() != “”) {
mapView.onResume();
if(!isFirstMapRender) {
UpdateMapState();
}
Log.d(“tag”, call.arguments.toString());
result.success(null);
}
break;
case “setUserId”:
mapView.onResume();
user.setUserId(call.arguments.toString());
result.success(null);
break;
case “setUserToken”:
user.setToken(call.arguments.toString());
result.success(null);
break;
case “openGps”:
addEmojiMarkers();
addUserTagBitMaps();
addUserTagBitMaps_Personal();
requestLocation();
result.success(null);
break;
}
}
}
);

//设置地图渲染完成回调
mBaiduMap.setOnMapRenderCallbadk(renderCallback);
//设置地图状态监听
mBaiduMap.setOnMapStatusChangeListener(listener);
}

new EventChannel(getFlutterView(), eventChannel).setStreamHandler(
new EventChannel.StreamHandler() {
@Override
public void onListen(Object args, final EventChannel.EventSink events) {
Log.d(TAG, “adding listener”);
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
events.success(eventString);// 发送事件(eventString);
}
return true;
}
});
}
@Override
public void onCancel(Object args) {
Log.d(TAG, “cancelling listener”);
}
}
);

BaiduMap.OnMapRenderCallback renderCallback = new BaiduMap.OnMapRenderCallback() {
/**

  • 地图渲染完成回调函数
    */
    @Override
    public void onMapRenderFinished() {
    if(isFirstMapRender) {
    Log.d(“OnMapRenderCallback”,“地图首次渲染完成回调函数”);
    isFirstMapRender = false;
    UpdateMapState();
    } else if(isSecondMapRender) {
    Log.d(“OnMapRenderCallback”,“地图二次渲染完成回调函数”);
    isSecondMapRender = false;
    UpdateMapState();
    }
    }
    };

BaiduMap.OnMapStatusChangeListener listener = new BaiduMap.OnMapStatusChangeListener() {
/**

  • 手势操作地图,设置地图状态等操作导致地图状态开始改变。
  • @param status 地图状态改变开始时的地图状态
    */
    @Override
    public void onMapStatusChangeStart(MapStatus status) {

}
/**

  • 手势操作地图,设置地图状态等操作导致地图状态开始改变。
  • @param status 地图状态改变开始时的地图状态
  • @param reason 地图状态改变的原因
    */

//用户手势触发导致的地图状态改变,比如双击、拖拽、滑动底图
//int REASON_GESTURE = 1;
//SDK导致的地图状态改变, 比如点击缩放控件、指南针图标
//int REASON_API_ANIMATION = 2;
//开发者调用,导致的地图状态改变
//int REASON_DEVELOPER_ANIMATION = 3;
@Override
public void onMapStatusChangeStart(MapStatus status, int reason) {

}

private void requestLocation() {
//通过LocationClientOption设置LocationClient相关参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType(“bd09ll”); //坐标类型
option.setIsNeedLocationDescribe(true);
//设置locationClientOption
mLocationClient.setLocOption(option);
//开启地图定位图层
mLocationClient.start();
}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值