在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
使用最新版本的百度地图需要注意的几个地方:
1、libs文件夹下要有android-support-v4.jar、baidumapapi_v2_1_0.jar、locSDK_3.1.jar三个jar包和armeabi文件夹。
2、布局文件要写成<com.baidu.mapapi.map.MapView />,旧版本是写作<com.baidu.mapapi.MapView />的。
3、AndroidMainfest这个配置文件要把该添加的东西都加上。比如各种权限、比如屏幕支持、比如百度地图服务
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service>
等
4、不要忘了申请自己的密钥。
……时间有限,就写这么多吧,遇到问题就百度一下,基本上也就解决了。
噢,附上自己的demo和各个链接。
百度地图API>Android SDK>相关下载 sdk下载 (http://developer.baidu.com/map/sdkandev-download.htm )
百度地图API>Android SDK>申请Key 申请key的链接 (http://developer.baidu.com/map/android-mobile-apply-key.htm)
百度地图API>定位 SDK>Android 定位SDK> 定位sdk的链接 (http://developer.baidu.com/map/geosdk-android-download.htm)
1、代码结构:
2、各个类的大致作用:
(1) Cheeses.java 填充没有用到的Fragment的内容
(2) DemoApplication.java 从百度地图sdk demo中直接拿来的;主要用来处理与key相关的操作
(3) MainActivity.java 实现适配器,完成不同Fragment之间的切换
(4) MapFragment.java 定位相关的操作
3、附上主要类的源码:
(1) MainActivity.java
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends FragmentActivity {
static final int NUM_ITEMS = ; MyAdapter mAdapter; ViewPager mPager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mAdapter = new MyAdapter(getSupportFragmentManager()); mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter); } public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
} @Override
public int getCount() {
return NUM_ITEMS;
} @Override
public Fragment getItem(int position) {
if (position == ) {
return MapFragment.newInstance();
}else{
return ArrayListFragment.newInstance(position);
}
}
} public static class ArrayListFragment extends ListFragment {
int mNum; /**
* Create a new instance of CountingFragment, providing "num"
* as an argument.
*/
static ArrayListFragment newInstance(int num) {
ArrayListFragment f = new ArrayListFragment(); // Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args); return f;
} /**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : ;
} /**
* The Fragment's UI is just a simple text view showing its
* instance number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
View tv = v.findViewById(R.id.text);
((TextView)tv).setText("Fragment #" + mNum);
return v;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
} @Override
public void onListItemClick(ListView l, View v, int position, long id) {
Log.i("FragmentList", "Item clicked: " + id);
}
}
}
(2) MapFragment.java
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class MapFragment extends Fragment { static MapView mMapView = null;
private MapController mMapController = null; // 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
MyLocationOverlay myLocationOverlay = null;
LocationData locData = null; static MapFragment newInstance() {
MapFragment f = new MapFragment();
return f;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DemoApplication app = (DemoApplication) getActivity().getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(getActivity());
app.mBMapManager.init(DemoApplication.strKey, new DemoApplication.MyGeneralListener());
} // LocationClient just init once;
// start() is moved
mLocClient = new LocationClient(getActivity()); LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
// option.setScanSpan(5000); //设置发起定位请求的间隔时间,单位毫秒 mLocClient.setLocOption(option); } @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_locationoverlay, container, false); mMapView = (MapView) v.findViewById(R.id.bmapView);
mMapController = mMapView.getController();
mMapView.getController().setZoom();
mMapView.getController().enableClick(true);
mMapView.setBuiltInZoomControls(true); myLocationOverlay = new MyLocationOverlay(mMapView);
locData = new LocationData();
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
mMapView.refresh();
return v;
} /**
* 监听函数,有新位置的时候,格式化成字符串,输出到屏幕中
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return;
costTime = System.currentTimeMillis() - startTime;
Log.d("MapFragment", "" + costTime);
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.accuracy = location.getRadius();
locData.direction = location.getDerect();
myLocationOverlay.setData(locData);
mMapView.refresh();
mMapController.animateTo(new GeoPoint((int) (locData.latitude * 1e6), (int) (locData.longitude * 1e6)));
// if request location success , stop it
stopRequestLocation();
} public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
}
} /**
* warning: this method is callback by activity manager; Be careful it's
* lifecycle : It is called after oncreate , before oncreateview; see
* detail:
* http://developer.android.com/reference/android/support/v4/app/Fragment
* .html#setUserVisibleHint(boolean)
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) { //核心方法,避免因Fragment跳转导致地图崩溃
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser == true) {
// if this view is visible to user, start to request user location
startRequestLocation();
} else if (isVisibleToUser == false) {
// if this view is not visible to user, stop to request user
// location
stopRequestLocation();
}
} private void stopRequestLocation() {
if (mLocClient != null) {
mLocClient.unRegisterLocationListener(myListener);
mLocClient.stop();
}
} long startTime;
long costTime; private void startRequestLocation() {
// this nullpoint check is necessary
if (mLocClient != null) {
mLocClient.registerLocationListener(myListener);
mLocClient.start();
mLocClient.requestLocation();
startTime = System.currentTimeMillis();
}
} @Override
public void onPause() {
mMapView.onPause();
super.onPause();
} @Override
public void onResume() {
mMapView.onResume();
super.onResume();
} @Override
public void onDestroy() {
if (mLocClient != null)
mLocClient.stop();
mMapView.destroy();
super.onDestroy();
} @Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState); } }
package baidumapsdk.fragment;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
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.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import baidumapsdk.demo.MapControlDemo;
import baidumapsdk.demo.R;
import baidumapsdk.demo.MapControlDemo.MyLocationListenner;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
public class MapFragment extends Fragment implements OnGetGeoCoderResultListener{
private static final String TAG="MapFragment";
/**
* MapView 是地图主控件
*/
private MapView mMapView;
private BaiduMap mBaiduMap;
// 定位相关
LocationClient mLocClient;
boolean isFirstLoc = true;// 是否首次定位
LocationClientOption option = null;
GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
public MyLocationListenner myListener = new MyLocationListenner();
private TextView textView_message;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case :
// LatLng target = mBaiduMap.getMapStatus().target;
//// MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
//// .newMapStatus(new MapStatus.Builder().target(target)
//// .overlook(-15).rotate(180).build());
//// mBaiduMap.setMapStatus(mapStatusUpdate);
// MyLocationData locData = new MyLocationData.Builder()
// .accuracy(100)
// // 此处设置开发者获取到的方向信息,顺时针0-360
// .direction(100).latitude(target.latitude/*+0.00059*/)
// .longitude(target.longitude).build();
// Log.i(TAG, "==-->point.latitude:="+target.latitude+" point.longitude:="+target.longitude);
// mBaiduMap.setMyLocationData(locData);
// 反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(mBaiduMap.getMapStatus().target));
// TextView textView = new TextView(getApplicationContext());
// textView.setText("我在这");
// OverlayOptions ooA = new MarkerOptions().position(target).icon(bdA).title("地图位置")
// .zIndex(9).draggable(true);
// mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));
break;
default:
break;
}
};
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.map_fragment, null);
mMapView = (MapView) view.findViewById(R.id.bmapView);
textView_message = (TextView) view.findViewById(R.id.textView_message);
mBaiduMap = mMapView.getMap();
// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(getActivity());
mLocClient.registerLocationListener(myListener);
option = new LocationClientOption();
Log.i(TAG, "==-->option:="+option);
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan();
mLocClient.setLocOption(option);
mLocClient.start();
return view;
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
mBaiduMap.setOnMapTouchListener(new OnMapTouchListener() {
@Override
public void onTouch(MotionEvent event) {
mLocClient.stop();
if (event.getAction() == MotionEvent.ACTION_UP) {
clearOverlay(null);
handler.sendEmptyMessage();
}
}
});
}
/**
* 清除所有Overlay
*
* @param view
*/
public void clearOverlay(View view) {
mBaiduMap.clear();
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
// // 反Geo搜索
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
.location(mBaiduMap.getMapStatus().target));
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction().latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
// 设置地图中心点
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(new MapStatus.Builder().target(latLng)
.overlook(-).rotate().build());
mBaiduMap.setMapStatus(mapStatusUpdate);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getActivity(), "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",
result.getLocation().latitude, result.getLocation().longitude);
// Toast.makeText(MapControlDemo.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(getActivity(), "抱歉,未能找到结果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.clear();
// mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
// .icon(BitmapDescriptorFactory
// .fromResource(R.drawable.icon_marka)));
BitmapDescriptor bd;
LatLng target = mBaiduMap.getMapStatus().target;
Double laDouble = (target.latitude+0.0003);
LatLng latLng = new LatLng(laDouble,target.longitude);
TextView textView = new TextView(getActivity());
textView.setGravity(Gravity.CENTER);
textView.setBackgroundResource(R.drawable.button_on);
textView.setTextColor(Color.RED);
textView.setText(result.getAddress());
// bd = BitmapDescriptorFactory.fromBitmap(getBitmapFromView(textView)); //这个属于自定义的
// bd = BitmapDescriptorFactory.fromView(textView)/*(getBitmapFromView(textView))*/; //这个是官方自身的
// OverlayOptions oo = new MarkerOptions().icon(bd).
// position(latLng);
// mBaiduMap.addOverlay(oo);
// mBaiduMap.addOverlay(new TextOptions().bgColor(Color.RED).fontSize(40).text(result.getAddress()).rotate(0).position(latLng/*mBaiduMap.getMapStatus().target*/));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
.getLocation()));
textView_message.setText(result.getAddress());
textView_message.setTextColor(Color.RED);
textView_message.setBackgroundResource(R.drawable.button_on);
// Toast.makeText(MapControlDemo.this, result.getAddress(),Toast.LENGTH_LONG).show();
}
}
在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)的更多相关文章
- IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息
IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocati ...
- 利用HBuilder开发基于MUI的H5+ app中使用百度地图定位功能
定位功能有两种方法: 首先要初始化内置地图: var map = new plus.maps.Map("map"); 这里黄色的map是html里面的id: <div id= ...
- AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...
- 在ionic/cordova中使用百度地图插件
在ionic项目中,如果想实现定位功能,可以使用ng-cordova提供的cordova-plugin-geolocation. 但由于高墙的缘故,国内andorid环境下,此插件不起作用(ios环境 ...
- Android 百度地图定位(手动+自动) 安卓开发教程
近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置. 经过2天研究 ...
- Android应用中使用百度地图API并加入标注(一)
网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就须要 ...
- 安卓---项目中插入百度地图sdk
百度地图 应用里面 自带地图 搜房网 下载百度地图的sdk 熟悉api 注冊百度开发人员的账号 2.12 仅仅要有一个ak就能够 高版本号须要提供应用程序的包名和签名返回开发人员的序列号 使用百度地图 ...
- Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”
今天老板让我验证一下技术可行性,记录下来. 需求 :定位手机的位置并在百度地图上显示,得到位置后使用前置摄像头进行抓拍 拿到这个需求后,对于摄像头的使用不太熟悉,于是我先做了定位手机并在百度地图上显示 ...
- 如何在vue单页应用中使用百度地图
作为一名开发人员,每次接到开发任务,我们首先应该先分析需求,然后再思考技术方案和解决方案.三思而后行,这是一个好的习惯. 需求:本项目是采用vue组件化开发的单页应用项目,现需要在项目中引入百度的地图 ...
随机推荐
- EA强大的画图工具---设计数据库表格
http://blog.csdn.net/senior_lee/article/details/30272169?utm_source=tuicool 关于EA这个优秀的软件是从师哥哪里听来的,自己瞎 ...
- vb安装过程中 ntvdm.exe[9696]中发生未处理的win32异常
最近电脑总是出问题导致我的学习效率很低,前几天在用VB6.0的时候有个知识点不太熟悉,于是按F1发现不会出来帮助文档.突然想到重新装系统之后忘记了安装MSDN帮助插件,就在我安装这个软件的时候发现电脑 ...
- CSS常用操作-对齐
index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- C语言--对数组地址的解析
在C编程中,我们进程会用到数组,这看起来很简单,因为,数组就是存储相同类型元素的集合嘛,不过,当你还没考虑到数组的地址问题时,一切都是简单的,如果你接触了数组中的地址概念,也许你会改变你的想法. 下面 ...
- 一些使用Android设备调试功能的注意事项(挖职位)
华为3C Activity切换动画过热. 当显示器是不是大图easy显现OOM(应用最大大于其他手机内容).因此,调试OOM不要当问题用这个手机,否则,很难发现问题. 小米3 不要调用系统的裁图功能. ...
- Oracle11g新特性之动态变量窥视
1. 11g之前的绑定变量窥视 我们都知道,为了可以让SQL语句共享运行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个变量来取代原来出如今SQL语句里的字 ...
- LF will be replaced by CRLF问题解决方法
[GIT] warning: LF will be replaced by CRLF问题解决方法 开发环境: 操作系统: windows xp ruby 1.9.2 rails 3.1.3 git v ...
- DataGrid( 数据表格) 组件[6]
本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...
- (转)【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案
近日在使用sql2008的过程中,要对已经创建完成的表结构进行修改,却一直提示弹出如下提示: “ 不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了“阻止保 ...
- SQL从入门到基础 - 06 限制结果集范围
一.限制结果集行数 1. Select top 5* from T_Employee order by FSalary DESC 2. (*)检索按照工资从高到低排序检索从第六名开始一共四个人的信息: ...