版权声明:本文为博主原创文章,未经博主允许不得转载。
转载请标明出处:http://blog.csdn.net/qq_30878303/article/details/79280240
虽然文采不好,但还是尽量尝试着写博客,一方面锻炼自己的写作能力,另一方面希望能帮到一些人。本文是项目中抽离出来的,没有Demo见谅。
本文没有什么很高深晦涩的代码,只是提供一个思路,解决宿主和插件中使用.so库时可能遇到各种坑。
一、场景&需求
使用Replugin插件化开发框架,宿主中使用了百度地图以及导航等,某一插件中需要一个在图中地址选择功能,或者一个获取位置信息的功能。
二、思路&实现
1.插件中,自己写的定位工具类获取位置信息可能不准确,所以获取宿主中的位置信息 :
private void getLocation() { try { Intent intent = new Intent(); intent.setComponent(new ComponentName("宿主包名", "宿主包名 .ui.map.GetLocationActivity")); startActivityForResult(intent, GET_LOCATION); } catch (Exception e) { e.printStackTrace(); //用其他方式不准确的方式获取位置信息 getBestLocation(); } }2.宿主中,创建GetLocationActivity,以及主要代码和配置如下:
布局的话随便新建一个空的布局即可
@Override public int initLayoutId() { return R.layout.activity_get_location;//布局的话随便新建一个空的布局即可 } @Override public void initData() { // ToastUtils.showShortSafe("GetLocationActivity"); LocationHelper locationHelper = LocationHelper.getInstance(); locationHelper.setCallBack(new LocationHelper.LocationCallBack() { @Override public void callBack(String addr, String streetnumber, double lat, double lng, String district, String street, String city, String province) { Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putDouble("lat",lat);//纬度 bundle.putDouble("lng",lng);//经度 LogUtils.e(street);//其他信息可以根据实际需求回传 intent.putExtras(bundle); setResult(RESULT_OK,intent); finish(); } }); locationHelper.start(); } @Override public boolean onTouchEvent(MotionEvent event) { LogUtils.e(event); finish(); return super.onTouchEvent(event); }贴下定位工具类的代码
import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import tengdi.agile.framework.core.util.LogUtils; import tengdi.agile.framework.core.util.Utils; public class LocationHelper { private LocationCallBack callBack; private static LocationHelper helper; private LocationClient locationClient; private BDLocationListener locationListener = new MyBDLocationListener(); private LocationHelper() { //第一步实例化定位核心类 locationClient = new LocationClient(Utils.getContext(), getLocOption()); //第二步设置位置变化回调监听 locationClient.registerLocationListener(locationListener); } public static LocationHelper getInstance() { if (helper == null) { helper = new LocationHelper(); } return helper; } public void start() { // 第三步开始定位 locationClient.start(); } //一般会在Activity的OnDestroy方法调用 public void stop() { if (locationClient != null) { locationClient.unRegisterLocationListener(locationListener); locationClient.stop(); locationClient = null; } } private LocationClientOption getLocOption() { LocationClientOption option = new LocationClientOption(); option.setAddrType("all"); //设置定位坐标系 option.setCoorType("bd09ll"); //重新定位时间间隔 //option.setScanSpan(60*1000); //设置是否打开gps option.setOpenGps(true); //设置定位模式 option.setLocationNotify(true); //是否需要poi结果 // option.setPoiDistance(1000); // option.setPoiExtraInfo(true); return option; } private class MyBDLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation bdLocation) { LogUtils.e(bdLocation); if (callBack != null && bdLocation != null) { callBack.callBack(bdLocation.getAddrStr(), bdLocation.getStreetNumber(), bdLocation.getLatitude(), bdLocation.getLongitude(), bdLocation.getDistrict(), bdLocation.getStreet(), bdLocation.getCity(), bdLocation.getProvince()); } //多次定位必须要调用stop方法 locationClient.stop(); } // @Override // public void onReceivePoi(BDLocation arg0) { // // } } public interface LocationCallBack { void callBack(String addr, String streetnumber, double lat, double lng, String district, String street, String city, String province); } public LocationCallBack getCallBack() { return callBack; } public void setCallBack(LocationCallBack callBack) { this.callBack = callBack; } }manifest中的配置:
<activity android:name=".ui.map.GetLocationActivity" android:exported="true" android:theme="@style/TranslucentFullScreenTheme"/>
3.宿主中,style中添加一个样式:
<style name="TranslucentFullScreenTheme" parent="AppTheme"> <item name="android:windowBackground">@color/translate</item> <item name="android:windowIsTranslucent">true</item> </style>
translate色值:01000000
4.插件中,
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == GET_LOCATION && resultCode == getActivity().RESULT_OK) { if (data != null) { Bundle bundle = data.getExtras(); double lat = bundle.getDouble("lat"); double lng = bundle.getDouble("lng"); LogUtils.e("定位" + lat + lng); // 这里就获取到宿主中位置信息,可以为所欲为了 //setLocationValue(lat, lng); } } }这里是以插件中获取宿主的位置信息为例,直接地址选择就更简单了,插件中就不用再导入百度地图所需的所有.so&aar文件和配置了。
- 如有觉得讲解的不明白的刚好用到Replugin的可以联系我