百度地图之定位,最新版

1.修改AndroidManifest.xml权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.main"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="10" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!--   添加对应的开发密钥: -->
          <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="2b05sutbEGMP1Cgz5UoDfnX0" />
          <!--    配置Activity: -->
       <activity
            android:name="com.my.main.LocationOverlayDemo"
            android:label="LocationOverlayDemo"
            android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="sensor" >
               <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       <service
            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.ACCESS_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:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="false"
        android:resizeable="true"
        android:smallScreens="true" />


</manifest>

2将所需要的 jar包放到libs文件夹下,jar包下载地址:http://developer.baidu.com/map/sdkandev-download.htm



3.修改布局文件

activity_locationoverlay.xml文件:

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <!-- 添加地图控件 -->
    <com.my.main.MyLocationMapView android:id="@+id/bmapView"
   android:layout_width="fill_parent" android:layout_height="fill_parent" 
   android:clickable="true"     
/>
     
     <Button
         android:id="@+id/button1"
         android:layout_width="40dp"
         android:layout_height="40dp"
         android:layout_alignParentRight="true"
         android:layout_alignParentTop="true"
         android:layout_marginRight="10dp"
         android:layout_marginTop="10dip"
         android:text="定位" 
         android:background="@drawable/button_style"
         android:textColor="#FF000000" />
</RelativeLayout>


custom_text_view.xml文件:


<?xml version="1.0" encoding="utf-8"?>


 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   >

    <TextView
        android:id="@+id/popleft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/popup_side"
         android:gravity="center"
        android:textStyle="bold"
         android:textColor="#3814ed"
        android:text="更新位置"
        android:textSize="12sp" />
 
   
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:id="@+id/popinfo"
   >
   
    <TextView
        android:id="@+id/textcache"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/popup_middle"
        android:gravity="center"
        android:textStyle="bold"
        android:textColor="@android:color/black"
        android:textSize="12sp" />
        </LinearLayout>
  
     <TextView
        android:id="@+id/popdown"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/popup_down"
        android:textColor="@android:color/black"
        android:textSize="12sp" />
    
    




     
    <TextView
        android:id="@+id/popright"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/popup_side"
        android:textColor="#3814ed"
        android:gravity="center"
        android:textStyle="bold"
        android:text="更新marker"
        android:textSize="12sp" />


</LinearLayout>

4.修改源代码  

主函数的源代码

package com.my.main;


import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;




import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.PopupClickListener;
import com.baidu.mapapi.map.PopupOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;


/**
 * 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置
 * 同时展示如何使用自定义图标绘制并点击时弹出泡泡
 *
 */


public class LocationOverlayDemo extends Activity {
/**

* 添加百度所需要的控件
*
*/
    private BMapManager mBMapManager;
private String a=null;
// 定位相关
LocationClient mLocClient;  //须在主线程中声明
LocationData locData = null;
public MyLocationListenner myListener = new MyLocationListenner();

//定位图层
locationOverlay myLocationOverlay = null;
//弹出泡泡图层
private PopupOverlay   pop  = null;//弹出泡泡图层,浏览节点时使用
private TextView  popupText = null;//泡泡view
private View viewCache = null;

//地图相关,使用继承MapView的MyLocationMapView目的是重写touch事件实现泡泡处理
//如果不处理touch事件,则无需继承,直接使用MapView即可
MyLocationMapView mMapView = null; // 地图View
private MapController mMapController = null;


//UI相关
Button requestLocButton = null;
boolean isRequest = false;//是否手动触发请求定位
boolean isFirstLoc = true;//是否首次定位




    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
        /**
         * 使用地图sdk前需先初始化BMapManager.
         * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
         * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
         */
        mBMapManager = new BMapManager(getApplicationContext()); 
        mBMapManager.init(new MKGeneralListener() {

@Override
public void onGetPermissionState(int error) {
                if (error == MKEvent.ERROR_NETWORK_CONNECT) {
                    Toast.makeText(LocationOverlayDemo.this, "您的网络出错啦!", Toast.LENGTH_LONG).show();
                } else if (error == MKEvent.ERROR_NETWORK_DATA) {
                    Toast.makeText(LocationOverlayDemo.this, "输入正确的检索条件!", Toast.LENGTH_LONG).show();
                }
            }

@Override
public void onGetNetworkState(int error) {
                if (error == MKEvent.ERROR_PERMISSION_DENIED) {
                    // 授权Key错误:
                    Toast.makeText(LocationOverlayDemo.this, "您的授权Key出错!", Toast.LENGTH_LONG).show();
                }
            }
});
        setContentView(R.layout.activity_locationoverlay);  
       
        CharSequence titleLable="定位功能";  //应用上端的名字
        setTitle(titleLable);
       
      
        requestLocButton = (Button)findViewById(R.id.button1);//定位按钮响应方法
  
        OnClickListener btnClickListener = new OnClickListener() {
        public void onClick(View v) {
requestLocClick();
}

};
 requestLocButton.setOnClickListener(btnClickListener);       

      /**
       * 
       * 然后实例化上面添加的百度控件
       *
       */
 //地图初始化
        mMapView = (MyLocationMapView)findViewById(R.id.bmapView);//加载地图
        mMapController = mMapView.getController();//getController这个对象可用于控制和驱动平移和缩放
        mMapView.getController().setZoom(18);  //设置缩放级别
        mMapView.getController().enableClick(true);//可以点击缩放
        mMapView.setBuiltInZoomControls(true);//表示可以缩放
       
        //创建 弹出泡泡图层
        createPaopao();
        
        //定位初始化
        mLocClient = new LocationClient( this );
        locData = new LocationData();
        mLocClient.registerLocationListener( myListener ); //注册监听函数,当没有注册监听函数时,无法发起网络请求
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);  //打开g p s
        option.setCoorType("bd09ll");     //设置坐标类型
        option.setPoiExtraInfo(true); // 设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。   
        option.setAddrType("all");   //设置返回类型,all = 表示返回所有的数据  
        option.setScanSpan(1000);// 设置发起定位请求的间隔时间为1000ms
        mLocClient.setLocOption(option);//初始化
        mLocClient.start(); //发起定位请求,第一次发起定位
       
        //定位图层初始化
myLocationOverlay = new locationOverlay(mMapView);
//设置定位数据
   myLocationOverlay.setData(locData);
   //添加定位图层
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
//修改定位数据后刷新图层生效
mMapView.refresh();

    }
    /**
     * 手动触发一次定位请求
     */
    public void requestLocClick(){
    isRequest = true;
        mLocClient.requestLocation();
      Toast.makeText(LocationOverlayDemo.this, "定位中……", Toast.LENGTH_SHORT).show();
    }
  
    /**
* 创建弹出泡泡图层
*/
public void createPaopao(){
viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);
        popupText =(TextView) viewCache.findViewById(R.id.textcache);
        //泡泡点击响应回调
        PopupClickListener popListener = new PopupClickListener(){
@Override
public void onClickedPopup(int index) {
Log.v("click", "clickapoapo");
}
        };
        pop = new PopupOverlay(mMapView,popListener);
        MyLocationMapView.pop = pop;
}
/**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {
   
        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location == null)
            {  return ;}
            
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();
            //如果不显示定位精度圈,将accuracy赋值为0即可
            locData.accuracy = location.getRadius();
            int type = location.getLocType();  
            Log.i("当前定位采用的类型是", "当前定位采用的类型是:type = " + type);  
              
            String coorType = location.getCoorType();  
            Log.i("坐标系类型", "坐标系类型:coorType = " + coorType);
         
            // 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。  
             a = location.getAddrStr();  
            Log.i("这就是地址", "address = " + a);  
            Toast.makeText(LocationOverlayDemo.this, a, Toast.LENGTH_SHORT).show();                     
//            String province = location.getProvince();  // 获取省份信息  
//           
//            String city = location.getCity();  // 获取城市信息  
//            String district = location.getDistrict(); // 获取区县信息                    
            // 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。
            //更新定位数据
            myLocationOverlay.setData(locData);
            //更新图层数据执行刷新后生效
            mMapView.refresh();
           
            
            //是手动触发请求或首次定位时,移动到定位点
            if (isRequest || isFirstLoc){
            //移动地图到定位点
            Log.d("LocationOverlay", "receive location, animate to it");
                mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6)));


            }
            //首次定位完成
            isFirstLoc = false;
          
        }
        
        public void onReceivePoi(BDLocation poiLocation) {
            if (poiLocation == null){
                return ;
            }
            if(poiLocation.hasPoi()){  
                String poiStr = poiLocation.getPoi();  
                Log.i("兴趣点::", "poiStr = " + poiStr);  
                  
            }  
              
            if(poiLocation.hasAddr()){  
                // 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。  
                String address = poiLocation.getAddrStr();  
                Log.i("地址是::", "address = " + address);  
            }  
        }
    }
    
    //继承MyLocationOverlay重写dispatchTap实现点击处理
  public class locationOverlay extends MyLocationOverlay{


  public locationOverlay(MapView mapView) {
  super(mapView);
  // TODO Auto-generated constructor stub
  }
  @Override
  protected boolean dispatchTap() {
  // TODO Auto-generated method stub
  //处理点击事件,弹出泡泡
  popupText.setBackgroundResource(R.drawable.popup);
popupText.setText(a);
pop.showPopup(BMapUtil.getBitmapFromView(popupText),
new GeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude*1e6)),
8);
  return true;
  }
 
  }


    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
     
    }
    
    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();


    }
    
    @Override
    protected void onDestroy() {
    //退出时销毁定位
        if (mLocClient != null)
            mLocClient.stop();
        mMapView.destroy();
        super.onDestroy();
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mMapView.onSaveInstanceState(outState);
   
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    mMapView.onRestoreInstanceState(savedInstanceState);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
//        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


}
/**
 * 继承MapView重写onTouchEvent实现泡泡处理操作
 * @author hejin
 *
 */
class MyLocationMapView extends MapView{
static PopupOverlay   pop  = null;//弹出泡泡图层,点击图标使用
public MyLocationMapView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyLocationMapView(Context context, AttributeSet attrs){
super(context,attrs);
}
public MyLocationMapView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
    public boolean onTouchEvent(MotionEvent event){
if (!super.onTouchEvent(event)){
//消隐泡泡
if (pop != null && event.getAction() == MotionEvent.ACTION_UP)
pop.hidePop();
}
return true;
}
}


BMapUtil函数的源代码

package com.my.main;


import android.graphics.Bitmap;
import android.view.View;


public class BMapUtil {
   
/**

* @param view
* @return
*/
public static Bitmap getBitmapFromView(View view) {
        view.destroyDrawingCache();
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.setDrawingCacheEnabled(true);
        Bitmap bitmap = view.getDrawingCache(true);
        return bitmap;
}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
因为最近项目需要,用了3个星期研究了一下百度地图的官方demo,并基于其源代码做了一定的修改,部分模仿了官方版的百度地图V5.3.1(version code: 431,目前最新版是6.0.1)的界面。现放出源代码供大家学习研究,修改版例子中的代码已经尽可能注释了,不过本人水平有限,代码质量可能有待提高,请大家勿用于商业用途,因为可能有很多未知BUG。觉得好的话请大家顶! 开发环境: eclipse:Android Developer Tools Build: v22.0.1-685705 JDK:java version "1.7.0_03" 测试环境: 三星GT-i9228 android2.3.6 主要改动: 1、LayersDemo里面把“普通图、卫星图及交通流量图”集成到了PreferencesActivity里面,修改立即生效。 2、MapControlDemo里面把“缩放级别、旋转、俯视”集成到了PreferencesActivity里面,修改立即生效。把截图功能加到了menu里面。 PS:这里顺便说一下新版百度地图怎么控制俯视角度,我查了好久,连官方的手势说明都没找到,被我无意之间发现了:两只手指同时向下滑为俯视,同时向上为恢复,当然也可以点击地图左上角的指南针 3、UISettingsDemo里面把“缩放、平移、双击放大、旋转” 开关手势功能和显示隐藏“缩放控件、指南针位置”UI控件集,成到了PreferencesActivity里面,修改立即生效。 4、LocationOverlayDemo里面增加了比例尺和自定义缩放控件。 5、OverlayDemo只做了位置修改,下面的两个才是重头戏。 6、RoutePlanDemo模仿了百度地图5.3.1的路径规划。 7、OfflineDemo模仿了百度地图5.3.1的离线地图,并集成到一个界面了。 如有问题请参照百度文档,或者联系我QQ472950043。 模仿的版本是百度地图5.3.1 ,大家有需要的话可以到豌豆荚下载历史版本里面下载baiduditu_431.apk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值