使用百度地图SDK来开发自己的程序(主要是考察自己读代码的能力)
2015-09-22 20:21
309 查看
最重要的是先自己安装百度的demo,根据这张图然后去找对应类中的代码
首先应该获得所要使用百度sdk的程序的包名,然后根据百度的提示,得到自己的密钥,在之后根据提示来配置自己的环境,注意阅读时应该仔细,然后在根据提示就能得到自己的地图,本文的关键是在地图的基础上实现定位功能,以及一些其他的小功能。
之后进入Android定位SDK的界面,在根据提示来配置定位的服务,注意的是在Android Studio中因为之前在/src/main/下创建了jniLibs文件夹,并且已经导入了东西,定位也需要导入一些so的东西,然后放在对应的文件夹下就可以了,还有注意在lib下导入jar包后,不要忘记在file下导入到工程中。在androidManifest下注意配置key,添加服务以及权限的添加。
因为百度地图是自己带有Demo示例的,所以在使用百度地图时,切记先安装Demo,看看哪些代码可以实现功能,然后再结合到自己的代码中,这才是所谓的进步。
主代码
package com.test.dukang.mylocation; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; 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.location.Poi; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeOption; 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.ReverseGeoCodeResult; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { //判断将值传递给第几个搜索的地点 private int flag = 0; //得到位置的客户端对象 public LocationClient mLocationClient = null; //得到自己定位的回应信息 public BDLocationListener myListener = new MyLocationListener(); /** * 出发地点的button */ private Button mButton; /** * 出发地点的输入框 */ private EditText mTextView; //指定达到的地点的button private Button mButtonTo; //到达地点的输入框 private EditText mTextViewTo; //得到百度地图的对象 private BaiduMap mBaiduMap = null; //得到搜索的对象 private GeoCoder mSearch; //自己定义在布局中的mapview MapView mMapView = null; //定位自己位置的按钮 private Button mButtonPitch; //出发的经纬度 private double Jstart; private double Wstart; //到达的经纬度 private double Jend; private double Wend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //注意使用地图必须在ContentView之前初始化 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //得到view中的控件 mButton = (Button) findViewById(R.id.button); mMapView = (MapView) findViewById(R.id.bmapView); mButtonPitch = (Button) findViewById(R.id.button_pitch); mTextView = (EditText) findViewById(R.id.textview); mButtonTo = (Button) findViewById(R.id.button_to); mTextViewTo = (EditText) findViewById(R.id.textview_to); //从自己的地图view中获取百度地图 mBaiduMap = mMapView.getMap(); mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(myListener); //注册事件的监听者 //初始化定位配置 initLocation(); //初始化搜索 mSearch = GeoCoder.newInstance(); //初始化代码 mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetGeoCodeResult(GeoCodeResult result) { //判断是否搜索到地点,然后给出对应值 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MainActivity.this, "未找到", Toast.LENGTH_LONG) .show(); return; } mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.ic_launcher))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation())); //判断是开始点还是结束点,然后传入对应的值 if (flag == 1) { Jstart = result.getLocation().latitude; Wstart = result.getLocation().longitude; } else if (flag == 2) { Jend = result.getLocation().latitude; Wend = result.getLocation().longitude; } String strInfo = String.format("纬度:%f 经度:%f", result.getLocation().latitude, result.getLocation().longitude); Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show(); } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { } }); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flag = 1; mSearch.geocode(new GeoCodeOption().city("北京").address(mTextView.getText().toString().trim())); } }); mButtonTo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flag = 2; mSearch.geocode(new GeoCodeOption().city("北京").address(mTextViewTo.getText().toString().trim())); //在两者间画线 LatLng p1 = new LatLng(Jstart, Wstart); LatLng p2 = new LatLng(Jend, Wend); List<LatLng> points = new ArrayList<LatLng>(); points.add(p1); points.add(p2); OverlayOptions ooPolyline = new PolylineOptions().width(10) .color(0xAAFF0000).points(points); mBaiduMap.addOverlay(ooPolyline); } }); mButtonPitch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mLocationClient.start(); } }); } private void initLocation() { //初始化定位服务 LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy ); option.setCoorType("bd09ll"); int span = 1000; option.setScanSpan(span); option.setIsNeedAddress(true); option.setOpenGps(true); option.setLocationNotify(true); option.setIsNeedLocationDescribe(true); option.setIsNeedLocationPoiList(true); option.setIgnoreKillProcess(false); option.SetIgnoreCacheException(false); option.setEnableSimulateGps(false); mLocationClient.setLocOption(option); } class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) { Jstart = location.getLatitude(); Wstart = location.getLongitude(); LatLng point = new LatLng(location.getLatitude(), location.getLongitude()); //在相应位置画一个小图标 mBaiduMap.addOverlay(new MarkerOptions().position(point) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.ic_launcher))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point)); //注意这里将定位关闭 mLocationClient.stop(); } //下面的这些信息都是在百度示例代码中含有的 //Receive Location // StringBuffer sb = new StringBuffer(256); // sb.append("time : "); // sb.append(location.getTime()); // sb.append("\nerror code : "); // sb.append(location.getLocType()); // sb.append("\nlatitude : "); // sb.append(location.getLatitude()); // sb.append("\nlontitude : "); // sb.append(location.getLongitude()); // sb.append("\nradius : "); // sb.append(location.getRadius()); // if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 // sb.append("\nspeed : "); // sb.append(location.getSpeed());// 单位:公里每小时 // sb.append("\nsatellite : "); // sb.append(location.getSatelliteNumber()); // sb.append("\nheight : "); // sb.append(location.getAltitude());// 单位:米 // sb.append("\ndirection : "); // sb.append(location.getDirection());// 单位度 // sb.append("\naddr : "); // sb.append(location.getAddrStr()); // sb.append("\ndescribe : "); // sb.append("gps定位成功"); // // } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 // sb.append("\naddr : "); // sb.append(location.getAddrStr()); // //运营商信息 // sb.append("\noperationers : "); // sb.append(location.getOperators()); // sb.append("\ndescribe : "); // sb.append("网络定位成功"); // } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 // sb.append("\ndescribe : "); // sb.append("离线定位成功,离线定位结果也是有效的"); // } else if (location.getLocType() == BDLocation.TypeServerError) { // sb.append("\ndescribe : "); // sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); // } else if (location.getLocType() == BDLocation.TypeNetWorkException) { // sb.append("\ndescribe : "); // sb.append("网络不同导致定位失败,请检查网络是否通畅"); // } else if (location.getLocType() == BDLocation.TypeCriteriaException) { // sb.append("\ndescribe : "); // sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); // } // sb.append("\nlocationdescribe : "); // sb.append(location.getLocationDescribe());// 位置语义化信息 // List<Poi> list = location.getPoiList();// POI数据 // if (list != null) { // sb.append("\npoilist size = : "); // sb.append(list.size()); // for (Poi p : list) { // sb.append("\npoi= : "); // sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); // } // } // Log.i("BaiduLocationApiDem", sb.toString()); } } }
布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <LinearLayout android:id="@+id/linearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <EditText android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="请输入起始点" android:textColor="#55ff0000" android:textSize="25sp" /> <Button android:id="@+id/button_pitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="定位" /> </LinearLayout> <LinearLayout android:id="@+id/end_linearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/linearLayout" android:orientation="horizontal"> <Button android:id="@+id/button_car" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="驾车" /> <Button android:id="@+id/button_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公交" /> <Button android:id="@+id/button_walk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="步行" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/end_linearLayout" android:orientation="horizontal"> <Button android:id="@+id/button_to" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="结束" /> <EditText android:id="@+id/textview_to" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="请输入结束点" android:textColor="#55ff0000" android:textSize="25sp" /> </LinearLayout> </RelativeLayout>
配置文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.dukang.mylocation"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <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" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <meta-data android:name="api_key" android:value="26vu9I0M4LBb9yLvNGqRDm7m" /> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="ryAHQdB4X493gPITWbmUGSkF" /> <activity android:name=".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> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service> </application> </manifest>
效果图
相关文章推荐
- Windows环境下修改Eclipse随笔提示
- JAVA Game: picking a card
- pkcs7 python ecb ebe
- win7下使用eclipse远程连接hadoop
- Java路径问题最终解决方案
- C语言中枚举的使用
- java定时任务
- JAVA Geometry: point in a circle?
- 流式套接字客户端/服务器编程 (迭代服务器+并发服务器)
- java的awt和swing的区别
- 真是服了:.EndEdit(); 如果没哟这个一句(c#更新ACCESS,datagridview无法更新第一行)
- php开发圣经-第七章
- Java引用类型
- KNN算法JAVA实现
- Eclipse 代码提示功能设置
- JAVA NIO之浅谈内存映射文件原理与DirectMemory
- Welcome to JAVA!(第3章课后习题)
- Python使用os.listdir()函数来获得目录中的内容
- Spring IoC 详解(下篇)
- JAVA上机——