魔兽自带地图图中修正我的位置

百度地图修改定位位置的图标
时间: 09:20:09
参考了很多网上修改地图位置图标的文章,尝试了几天也没搞定。没法还是回过头仔细看官方库文档,发现网上都是用的百度api库都是以前的,我用现在最新的百度api库,编都编译不过,修改编译过了,但定位位置的图标还是没有改变。仔细看官方文档,终于有了发现,原来从库2.0.0版本开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。原来这样,我按官方修改自己代码就OK了。
开发环境:
开发平台:adt-bundle-windows-x86-
编译器:jdk-7u17-windows-i586.exe
效果如下:默认定位图标:
修改后的定位图标
现在的代码都写得很简单,基本上就是入门之类的,都只有一个窗口,单个调试实现功能。以后再把这些窗口组合在一起,实现一个具体的项目。单窗口程序一般只需编写如下三个文件:项目总配置文件AndroidMainfest.xml、窗口布局文件activity_main.xml、主屏幕MainActivity.java。这里都是用的默认名,可以根据自己工程修改。开始依次实现上面3个文件。
一、编写代码
1.项目总配置文件AndroidMainfest.xml
该文件是每个Android程序的必须文件。主要记录应用中所使用的各种组件,指定应用程序中使用到服务的权限。主窗口也是在该文件指定,代码如下:
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="/apk/res/android"
package="com.example.mapsbase"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="10"
android:targetSdkVersion="10" /&
&application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &
&activity android:name=".MapDemo"
android:screenOrientation="sensor"
android:configChanges="orientation|keyboardHidden"&
&/activity&
android:name="com.example.mapsbase.MainActivity"
android:label="@string/app_name" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"&
&/service&
&/application&
&uses-permission android:name="android.permission.GET_ACCOUNTS" /&
&uses-permission android:name="android.permission.USE_CREDENTIALS" /&
&uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /&
&uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /&
&permission android:name="android.permission.BAIDU_LOCATION_SERVICE" &
&/permission&
&uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" &
&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" &
&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" &
&/uses-permission&
&uses-permission android:name="android.permission.INTERNET" &
&/uses-permission&
&uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"&&/uses-permission&
&uses-permission android:name="android.permission.READ_LOGS"&&/uses-permission&
&uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" &
&/uses-permission&
&!-- &uses-permission android:name="android.permission.WRITE_APN_SETTINGS"&&/uses-permission& --&
&uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" &
&/uses-permission&
&uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /&
&uses-permission android:name="android.permission.WAKE_LOCK" &
&/uses-permission&
&uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
&uses-permission android:name="android.permission.ACCESS_GPS" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.READ_CONTACTS" /&
&uses-permission android:name="android.permission.CALL_PHONE" /&
&uses-permission android:name="android.permission.READ_SMS" /&
&uses-permission android:name="android.permission.SEND_SMS" /&
&!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --&
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="android.permission.CAMERA" &
&/uses-permission&
&uses-permission android:name="android.permission.RECORD_AUDIO" &
&/uses-permission&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" &
&/uses-permission&
&uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&
&uses-permission android:name="android.permission.BROADCAST_STICKY" /&
&uses-permission android:name="android.permission.WRITE_SETTINGS" /&
&!-- 来电消音 --&
&uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" &
&/uses-permission&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /&
&supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"/&
&/manifest& 注意添加以下服务
&&&&&&&& &service
&&&&&&&&&&&&& android:name="com.baidu.location.f"
&&&&&&&&&&&&& android:enabled="true"
&&&&&&&&&&&&& android:process=":remote"&&&&&&&&&&
&&&&&&& &/service&
声明如下使用权限
&uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"&&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"&&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE"&&/uses-permission&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"&&/uses-permission&
&uses-permission android:name="android.permission.CHANGE_WIFI_STATE"&&/uses-permission&
&uses-permission android:name="android.permission.READ_PHONE_STATE"&&/uses-permission&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&&/uses-permission&
&uses-permission android:name="android.permission.INTERNET" /&
&uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"&&/uses-permission&
&uses-permission android:name="android.permission.READ_LOGS"&&/uses-permission&
不然程序启动不了,会报错,其它与以前基本一致。
2.窗口布局文件activity_main.xml
该文件是每个Android程序的必须文件。主要记录应用中所使用的各种组件,指定应用程序中使用到服务的权限。主窗口也是在该文件指定,代码如下:
2.窗口布局文件activity_main.xml
该文件是每个Android程序的必须文件。主要记录应用中所使用的各种组件,指定应用程序中使用到服务的权限。主窗口也是在该文件指定,代码如下:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"&
android:id="@+id/button1"
android:layout_width="194dp"
android:layout_height="wrap_content"
android:text="Update My Location" /&
&com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" /&
&/LinearLayout& 3.主屏幕MainActivity.java
这个是大头,功能基本上也是在这里实现,这里介绍如何自定义图层,添加覆盖物。
添加覆盖物的一般流程如下:
1) 创建OverlayItem,准备overlay数据;
2) 创建ItemizedOverlay实例,调用 addItem(OverlayItem)} 接口添加overlay。
3) 调用MapView.getOverlays().add()方法添加overlay到mapview中。
4) 调用MapView.refresh() 使Overlay生效
注意:ItemnizedOverlay 目前不支持多实例,只能向MapView添加一个ItemizedOverlay
完整代码MainActivity.java:
package com.example.
import android.app.A
import android.content.res.C
import android.graphics.B
import android.graphics.drawable.D
import android.os.B
import android.os.H
import android.util.L
import android.view.M
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.FrameL
import android.widget.T
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.map.ItemizedO
import com.baidu.mapapi.map.LocationD
import com.baidu.mapapi.map.MKMapViewL
import com.baidu.mapapi.map.MapC
import com.baidu.mapapi.map.MapP
import com.baidu.mapapi.map.MapV
import com.baidu.mapapi.map.MyLocationO
import com.baidu.mapapi.map.OverlayI
import com.api.basestruct.GeoP
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.baidu.location.BDNotifyL//假如用到位置提醒功能,需要import该类
public class MainActivity extends Activity {
BMapManager mBMapMan =
MapView mMapView =
private MapController mMapController =
public MKMapViewListener mMapListener =
MyLocationOverlay myLocationOverlay = new MyLocationOverlay(mMapView);
LocationData locData = new LocationData();
//定位相关
public LocationClient mLocationClient =
public BDLocationListener myListener = new MyLocationListenner();
public NotifyLister mNotifyer=
//public LocationClient mLocC//cause stop run
//LocationData locData =
//MyLocationOverlay myLocationOverlay =
Button testUpdateButton =
EditText indexText =
int index =0;
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Toast.makeText(MainActivity.this, "msg:" +msg.what, Toast.LENGTH_SHORT).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBMapMan=new BMapManager(getApplication());
mBMapMan.init("7ED5DEC7BDB29CAEDED6", null);
//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
setContentView(R.layout.activity_main);
mMapView=(MapView)findViewById(R.id.bmapsView);
mMapView.setBuiltInZoomControls(true);
//mMapView.setTraffic(true);
//实时交通信息图
//mMapView.setSatellite(true);
//设置启用内置的缩放控件
mMapController=mMapView.getController();
initMapView();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point);//设置地图中心点
mMapController.setZoom(12);//设置地图zoom级别
mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
mLocationClient.registerLocationListener( myListener );
//注册监听函数
//setLocationOption();
testUpdateButton = (Button)findViewById(R.id.button1);
OnClickListener clickListener = new OnClickListener(){
public void onClick(View v) {
testUpdateClick();
testUpdateButton.setOnClickListener(clickListener);
protected void onDestroy(){
mLocationClient.stop();
mLocationClient.unRegisterLocationListener(myListener); //卸载监听函数
mMapView.destroy();
if(mBMapMan!=null){
mBMapMan.destroy();
super.onDestroy();
protected void onPause(){
mMapView.onPause();
if(mBMapMan!=null){
mBMapMan.stop();
super.onPause();
protected void onResume(){
mMapView.onResume();
if(mBMapMan!=null){
mBMapMan.start();
super.onResume();
public void testUpdateClick(){
setLocationOption();
//mLocClient.start();
mLocationClient.start();
//mLocClient.requestLocation();
mLocationClient.requestLocation();
private void initMapView() {
mMapView.setLongClickable(true);
//mMapController.setMapClickEnable(true);
//mMapView.setSatellite(false);
* 监听函数,又新位置的时候,格式化成字符串,输出到屏幕中
public class MyLocationListenner implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
if (location == null)
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.accuracy = location.getRadius();
locData.direction = location.getDerect();
myLocationOverlay.setData(locData);
//mMapView.getOverlays().add(myLocationOverlay);//在地图上添加我的位置
//准备要添加的Overlay
//double mLat1 = 39.90923;
//double mLon1 = 116.397428;
//double mLat2 = 39.9022;
//double mLon2 = 116.3922;
//double mLat3 = 39.917723;
//double mLon3 = 116.3722;
// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
//GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
//GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));
//GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));
GeoPoint p2 = new GeoPoint((int) (locData.latitude * 1E6), (int) (locData.longitude * 1E6));
//准备overlay图像数据,根据实情情况修复
Drawable mark= getResources().getDrawable(R.drawable.ic_launcher);
//用OverlayItem准备Overlay数据
//OverlayItem item1 = new OverlayItem(p1,"item1","item1");
//使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置
OverlayItem item2 = new OverlayItem(p2,"item2","item2");
item2.setMarker(mark);
//OverlayItem item3 = new OverlayItem(p3,"item3","item3");
//创建IteminizedOverlay
OverlayTest itemOverlay = new OverlayTest(mark, mMapView);
//将IteminizedOverlay添加到MapView中
//注意:目前IteminizedOverlay不支持多实例,MapView中只能有一个IteminizedOverlay实例
mMapView.getOverlays().clear();
mMapView.getOverlays().add(itemOverlay);
//现在所有准备工作已准备好,使用以下方法管理overlay.
//添加overlay, 当批量添加Overlay时使用addItem(List&OverlayItem&)效率更高
//itemOverlay.addItem(item1);
itemOverlay.addItem(item2);
//itemOverlay.addItem(item3);
mMapView.refresh();
//删除overlay .
//itemOverlay.removeItem(itemOverlay.getItem(0));
// mMapView.refresh();
//清除overlay
// itemOverlay.removeAll();
// mMapView.refresh();
mMapView.refresh();
mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *
1e6)), mHandler.obtainMessage(1));
//mMapView.getController().animateTo(new GeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude* 1e6)));
public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null){
public class NotifyLister extends BDNotifyListener{
public void onNotify(BDLocation mlocation, float distance) {
//设置相关参数
private void setLocationOption(){
LocationClientOption option = new LocationClientOption();
//option.setAddrType("all");
//option.setPoiExtraInfo(true);
//option.setProdName("定位我当前的位置");
//option.setOpenGps(false);
option.setOpenGps(true);
option.setScanSpan(500);
//option.setPoiDistance(500);
//option.disableCache(true);
option.setCoorType("bd09ll");
//option.setScanSpan(5000);
//option.setPoiNumber(3);
option.setPriority(LocationClientOption.NetWorkFirst);
mLocationClient.setLocOption(option);
//mMapView.getController().setZoom(14);
mMapView.getController().enableClick(true);
* 要处理overlay点击事件时需要继承ItemizedOverlay
* 不处理点击事件时可直接生成ItemizedOverlay.
class OverlayTest extends ItemizedOverlay&OverlayItem& {
//用MapView构造ItemizedOverlay
public OverlayTest(Drawable marker,MapView mapView){
super(marker,mapView);
protected boolean onTap(int index) {
//在此处理item点击事件
System.out.println("item onTap: "+index);
public boolean onTap(GeoPoint pt, MapView mapView){
//在此处理MapView的点击事件,当返回 true时
super.onTap(pt,mapView);
// 自2.1.1 开始,使用 add/remove 管理overlay , 无需重写以下接口
protected OverlayItem createItem(int i) {
return mGeoList.get(i);
public int size() {
return mGeoList.size();
} 二、编译、测试
编译,右击工程名,点Build Projec即可,切换到Problems窗口看编译结果,没有错误,但很多警告。编译完直接运行,同样右击工程名,点Run As,选Android Applicartion即可,如果插上手机、平板等设备,会提示在哪个上面运行。我的模拟器定位不显示地图,但放到平板定位正常:
$T.total > 0 && $T.page <= $T.pageNum}
{#foreach $T.data as r}
{$T.r.formt_tm}{#if $T.r.nickname}{#else}匿名{#/if}
{$T.r.content}
{#if $T.page > 1 && $T.pageNum > 1)
$T.s_num > 2}
{#for index = $T.s_num to $T.e_num}
$T.pageNum > $T.pageNavSize+ 2 && $T.s_num != $T.pageNum - $T.pageNavSize}
{#if $T.pageNum > 1}
{#if $T.pageNum != $T.page && $T.pageNum > 1}
<a href="javascript:void(0);" page="{$T.page 下一页
您的回应...
也许你感兴趣
(C)2012 本站提供的内容来源于广大网络用户,我们不保证内容的正确性。如果转载了您的内容,希望删除的请联系我们!后使用快捷导航没有帐号?
中的百度地图,能否修改离线地图保存位置?默认是在那只有800MB的内置SD中,能不能把它移动到外插的SD卡上。
帖子中提到的商品
发烧级手机控(Lv3)
来自手机版
我的自动保存在SD卡,2.3路过
神仙级手机控(Lv5)
我的是1.0,默认是在内置的呀。难道是第一次使用时没插卡的原因?
潜力级手机控(Lv1)
同问.。。。。。。。。。。。。。。。。。。。。
潜力级手机控(Lv1)
之前也是每天看帖无数,基本上不回帖
后来我发现这样很傻很天真,很多比哥注册晚的人级
别都比我高
哥终于觉悟了,于是我抄下了这段话,每看一贴就复
每帖发10次一共得10米,自己得分还帮别人顶贴 一举
看帖!回帖!是美德!!!
顶贴!刷分!更高尚!!!
支持!小米!爱小米!!!
扣分!骂人!没教养!!!
潜力级手机控(Lv1)
这个帖子沉了没有啊?我也想问一下,怎么办啊,手机存储只有800M,这么搞法一会儿就满了啊
潜力级手机控(Lv1)
呃,我太草率了
刚回了贴,发现百度地图里面就有的设置,一整,全部移到外部存储卡去了,手机存储又空出来了
高级手机控(Lv2)
之前也是每天看帖无数,基本上不回帖
后来我发现这样很傻很天真,很多比哥注册晚的人级
别都比我高
哥终于觉悟了,于是我抄下了这段话,每看一贴就复
每帖发10次一共得10米,自己得分还帮别人顶贴 一举
看帖!回帖!是美德!!!
顶贴!刷分!更高尚!!!
支持!小米!爱小米!!!
潜力级手机控(Lv1)
之前也是每天看帖无数,基本上不回帖
后来我发现这样很傻很天真,很多比哥注册晚的人级
版块推荐百宝箱
你心目中最好的的新年礼物是什么样子的呢?快来发挥你的想象力!我们将从所有ps大神中选择最佳创意的一张图,赠送#小米旗舰新品发布会#门票一张!
iHealth小米血压计年度新功能火爆开测,本版增加了语音留言、语音报血压、”儿女注册爸妈使用“三大主要功能。还等什么?快来参加吧!
每天10台小米电视2免运费,立减100元/150元,免费送货到家!现已开放263个购买城市,无需预约立即购买!49英寸智能小米电视2仅售3399元。
2015年已经到来~ 春节还远嘛?小米羊年【年货大集】上线啦!为你准备了海量超值年货,羊年就买最潮最时尚的数码年货送家人,送亲朋好友~
小米手机ROM
本周推荐度
MIUI 5.1.9
小米官方精品配件
京ICP证110507号 京ICP备号 京公网安备号}

我要回帖

更多关于 诺基亚自带地图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信