版权声明:本文为博主原创文章,未经博主允许不得转载。
转载请标明出处: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的可以联系我