Android使用百度LBS SDK
2014-12-05 19:00
441 查看
类似百度应用引擎,使用百度的LBS服务,首先我们在百度开放服务平台创建一个应用,如下图:
进入应用详情,然后点击“LBS服务”,设置应用:
数字签名的获取方式,可以在Eclipse(ADT 22)中查看,Window->Preferences->Android->Build,SHA1 fingerprint就是我们需要的:
Android SDK安全码组成:数字签名+;+包名。
接着下载LBS Android SDK,然后按照百度官方文档的方法进行操作:
第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;
注:liblocSDK3.so和locSDK_3.1.jar为百度定位SDK所使用资源,开发者可根据实际需求自行添加。
第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:
1. 在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;
2. Project -> clean-> clean all .
然后在我们的应用中配置相关权限和Key:
(1)在application中添加开发密钥:
(2)添加所需权限
(4)在应用程序创建时初始化 SDK引用的Context 全局变量:
(5)管理地图生命周期:
到这里就可以显示地图了,但是只能显示北京,并没有定位,明天总结一下定位的实现。
昨天初步接触了百度的LBS SDK,让应用可以通过MapView显示地图,今天在昨天的代码基础上,实现一下定位功能:
首先看一下效果图吧:
左下角的按钮可以切换模式,分为三种:
普通(LocationMode.NORMAL)、
跟随(LocationMode.FOLLOWING)、
罗盘(LocationMode.COMPASS),相信用过百度地图的同学对这几个模式不陌生吧。
下面是代码:
分别声明一个MapView和BaiduMap:
在SetContentView之前要初始化SDK:
更换定位图标的方法:
定位模式:
初始化:
setScanSpan是定位时间间隔(ms),setCoorType坐标类型分为三种:
bd09ll
百度加密经纬度坐标
bd09
百度加密墨卡托坐标
gcj02
国测局加密经纬度坐标
定位SDK监听函数:
复写onPause,onResume,onDestory:
在AndroidManifest.xml中声明Service,这一步很关键,不写则无法定位:
当然,Key也是不可或缺,而且必须正确的:
最后,在AndroidManifest.xml文件中要加入需要的权限:
到此就大功告成了。
用Service获取经纬度,onCreate中开始采集经纬度点,保存到ArrayList
每隔5秒取样一次,若经纬度未发生变化,丢弃该次取样
在onDestroy中,将ArrayList转成JSON格式,然后存储到SDCard中
读取目录下所有轨迹文件,并生成ListView
在OnItemClick中将文件名称通过intent.putExtra传递给显示轨迹的Activity
根据文件名将对应的JSON内容转成ArrayList
然后将以上ArrayList的点集依次连线,并绘制到百度地图上
设置起始点Marker,Zoom级别,中心点为起始点
轨迹点小于2个无法绘制轨迹,给出提示
初步Demo效果图,获取的经纬度有偏移,明天看看哪里的问题:
先贴一个保存经纬度点的Service的核心代码:
同一数据,优化前后效果对比:
优化算法:
转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui
进入应用详情,然后点击“LBS服务”,设置应用:
数字签名的获取方式,可以在Eclipse(ADT 22)中查看,Window->Preferences->Android->Build,SHA1 fingerprint就是我们需要的:
Android SDK安全码组成:数字签名+;+包名。
接着下载LBS Android SDK,然后按照百度官方文档的方法进行操作:
第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;
注:liblocSDK3.so和locSDK_3.1.jar为百度定位SDK所使用资源,开发者可根据实际需求自行添加。
第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。
通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。
注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:
1. 在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;
2. Project -> clean-> clean all .
然后在我们的应用中配置相关权限和Key:
(1)在application中添加开发密钥:
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> </application>
(2)添加所需权限
<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" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />(3)布局
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
(4)在应用程序创建时初始化 SDK引用的Context 全局变量:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
(5)管理地图生命周期:
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
到这里就可以显示地图了,但是只能显示北京,并没有定位,明天总结一下定位的实现。
昨天初步接触了百度的LBS SDK,让应用可以通过MapView显示地图,今天在昨天的代码基础上,实现一下定位功能:
首先看一下效果图吧:
左下角的按钮可以切换模式,分为三种:
普通(LocationMode.NORMAL)、
跟随(LocationMode.FOLLOWING)、
罗盘(LocationMode.COMPASS),相信用过百度地图的同学对这几个模式不陌生吧。
下面是代码:
分别声明一个MapView和BaiduMap:
private MapView mMapView; private BaiduMap mBaiduMap;
在SetContentView之前要初始化SDK:
SDKInitializer.initialize(getApplicationContext());
更换定位图标的方法:
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); // 自定义图标 // mCurrentMarker =null ; // 默认图标 mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
定位模式:
private LocationMode mCurrentMode;
mCurrentMode = LocationMode.NORMAL; // 普通模式 // mCurrentMode = LocationMode.FOLLOWING; // 跟随模式 // mCurrentMode = LocationMode.COMPASS; // 罗盘模式 mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
初始化:
// 地图初始化 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(5000); mLocClient.setLocOption(option); mLocClient.start();
setScanSpan是定位时间间隔(ms),setCoorType坐标类型分为三种:
bd09ll
百度加密经纬度坐标
bd09
百度加密墨卡托坐标
gcj02
国测局加密经纬度坐标
定位SDK监听函数:
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); 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) { } }
复写onPause,onResume,onDestory:
@Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; super.onDestroy(); }
在AndroidManifest.xml中声明Service,这一步很关键,不写则无法定位:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
当然,Key也是不可或缺,而且必须正确的:
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="************************" />
最后,在AndroidManifest.xml文件中要加入需要的权限:
<!-- For BaiduMap SDK START --> <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" /> <!-- For BaiduMap SDK END -->
到此就大功告成了。
记录轨迹思路
用Service获取经纬度,onCreate中开始采集经纬度点,保存到ArrayList每隔5秒取样一次,若经纬度未发生变化,丢弃该次取样
在onDestroy中,将ArrayList转成JSON格式,然后存储到SDCard中
显示轨迹思路
读取目录下所有轨迹文件,并生成ListView在OnItemClick中将文件名称通过intent.putExtra传递给显示轨迹的Activity
根据文件名将对应的JSON内容转成ArrayList
然后将以上ArrayList的点集依次连线,并绘制到百度地图上
设置起始点Marker,Zoom级别,中心点为起始点
轨迹点小于2个无法绘制轨迹,给出提示
初步Demo效果图,获取的经纬度有偏移,明天看看哪里的问题:
先贴一个保存经纬度点的Service的核心代码:
public class RouteRecordService extends Service { private LocationClient mLocationClient; private final String ROUTE_PATH = "/sdcard/Route/"; private String startTime = ""; private String stopTime = ""; private List<RoutePoint> list = new ArrayList<RoutePoint>(); private RouteAdapter adapter = new RouteAdapter(); private int startId = 1; // 轨迹点初始ID private int defaultDelay = 5000; // 轨迹点取样间隔时间:ms private final static double ERROR_CODE = 55.555; private double routeLng; private double routeLat; private boolean isEncrypt = false; // true:读取百度加密经纬度 false:读取设备提供经纬度 private boolean isDebug = true; // 设备定位经纬度 private enum DeviceLocType { LATITUDE, LONGITUDE } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); InitLocation(LocationMode.Hight_Accuracy, "gcj02", 1000, false); // 初始化路径 File filestoreMusic = new File(ROUTE_PATH); if (!filestoreMusic.exists()) { filestoreMusic.mkdir(); } startTime = getTimeStr(); if (isDebug) { Toast.makeText(getApplicationContext(), "Start Record Route", Toast.LENGTH_SHORT).show(); } // 开启轨迹记录线程 new Thread(new RouteRecordThread()).start(); } public class RouteRecordThread implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(defaultDelay); Message message = new Message(); message.what = 1; recordHandler.sendMessage(message); } catch (Exception e) { e.printStackTrace(); } } } } final Handler recordHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: startRecordRoute(); } super.handleMessage(msg); } }; private void startRecordRoute() { // 获取设备经纬度 if (!isEncrypt) { routeLat = getDeviceLocation(DeviceLocType.LATITUDE); routeLng = getDeviceLocation(DeviceLocType.LONGITUDE); if (isDebug) Toast.makeText(getApplicationContext(), "Device Loc:" + routeLat + "," + routeLng, Toast.LENGTH_SHORT).show(); } RoutePoint routePoint = new RoutePoint(); if (routeLng != 5.55 && routeLat != 5.55) { if (list.size() > 0 && list.get(list.size() - 1).getLat() == routeLat && (list.get(list.size() - 1).getLng() == routeLng)) { if (isDebug) { // Toast.makeText(getApplicationContext(), // "Route not change", // Toast.LENGTH_SHORT).show(); } } else { routePoint.setId(startId++); routePoint.setLng(routeLng); routePoint.setLat(routeLat); list.add(routePoint); } } } /** * 获取设备提供的经纬度,Network或GPS * * @param type * 请求经度还是纬度 * @return */ private double getDeviceLocation(DeviceLocType type) { double deviceLat = ERROR_CODE; double deviceLng = ERROR_CODE; LocationManager locationManager = (LocationManager) getSystemService(getApplicationContext().LOCATION_SERVICE); if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Location location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { deviceLat = location.getLatitude(); deviceLng = location.getLongitude(); } else { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 1000, 0, new deviceLocationListener()); Location location1 = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location1 != null) { deviceLat = location1.getLatitude(); // 经度 deviceLng = location1.getLongitude(); // 纬度 } } } else { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 1000, 0, new deviceLocationListener()); Location location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { deviceLat = location.getLatitude(); // 经度 deviceLng = location.getLongitude(); // 纬度 } } if (type == DeviceLocType.LATITUDE) return deviceLat; else if (type == DeviceLocType.LONGITUDE) return deviceLng; else return ERROR_CODE; } /** * 设备位置监听器 * */ class deviceLocationListener implements LocationListener { // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 public void onStatusChanged(String provider, int status, Bundle extras) { } // Provider被enable时触发此函数,比如GPS被打开 @Override public void onProviderEnabled(String provider) { } // Provider被disable时触发此函数,比如GPS被关闭 @Override public void onProviderDisabled(String provider) { } // 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 @Override public void onLocationChanged(Location location) { // routeLat = location.getLatitude(); // 经度 // routeLng = location.getLongitude(); // 纬度 } }; private String getTimeStr() { long nowTime = System.currentTimeMillis(); Date date = new Date(nowTime); String strs = "" + ERROR_CODE; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); strs = sdf.format(date); } catch (Exception e) { e.printStackTrace(); } return strs; } /** * 初始化轨迹文件路径和名称 * * @return String */ private String getFilePath() { stopTime = getTimeStr(); String format = ".json"; if (isDebug) format = ".txt"; return ROUTE_PATH + startTime + "-" + stopTime + format; } class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // 读取百度加密经纬度 if (isEncrypt) { routeLng = location.getLongitude(); routeLat = location.getLatitude(); } } } }
优化轨迹平滑度:
同一数据,优化前后效果对比: 优化算法:
public List<RoutePoint> optimizePoints(List<RoutePoint> inPoint) { int size = inPoint.size(); List<RoutePoint> outPoint; int i; if (size < 5) { return inPoint; } else { // Latitude inPoint.get(0) .setLat((3.0 * inPoint.get(0).getLat() + 2.0 * inPoint.get(1).getLat() + inPoint.get(2).getLat() - inPoint .get(4).getLat()) / 5.0); inPoint.get(1) .setLat((4.0 * inPoint.get(0).getLat() + 3.0 * inPoint.get(1).getLat() + 2 * inPoint.get(2).getLat() + inPoint.get(3).getLat()) / 10.0); inPoint.get(size - 2).setLat( (4.0 * inPoint.get(size - 1).getLat() + 3.0 * inPoint.get(size - 2).getLat() + 2 * inPoint.get(size - 3).getLat() + inPoint.get( size - 4).getLat()) / 10.0); inPoint.get(size - 1).setLat( (3.0 * inPoint.get(size - 1).getLat() + 2.0 * inPoint.get(size - 2).getLat() + inPoint.get(size - 3).getLat() - inPoint.get( size - 5).getLat()) / 5.0); // Longitude inPoint.get(0) .setLng((3.0 * inPoint.get(0).getLng() + 2.0 * inPoint.get(1).getLng() + inPoint.get(2).getLng() - inPoint .get(4).getLng()) / 5.0); inPoint.get(1) .setLng((4.0 * inPoint.get(0).getLng() + 3.0 * inPoint.get(1).getLng() + 2 * inPoint.get(2).getLng() + inPoint.get(3).getLng()) / 10.0); inPoint.get(size - 2).setLng( (4.0 * inPoint.get(size - 1).getLng() + 3.0 * inPoint.get(size - 2).getLng() + 2 * inPoint.get(size - 3).getLng() + inPoint.get( size - 4).getLng()) / 10.0); inPoint.get(size - 1).setLng( (3.0 * inPoint.get(size - 1).getLng() + 2.0 * inPoint.get(size - 2).getLng() + inPoint.get(size - 3).getLng() - inPoint.get( size - 5).getLng()) / 5.0); } return inPoint; }
截取轨迹图片并分享
@@ -1,14 +1,24 @@ package com.zms.baidulbs; +import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.util.EncodingUtils; import android.app.Activity; +import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.net.Uri; import android.os.Bundle; +import android.view.View; +import android.view.Window; import android.widget.Button; import android.widget.Toast; @@ -24,6 +34,7 @@ import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; +import com.baidu.mapapi.map.BaiduMap.SnapshotReadyCallback; import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; import com.baidu.mapapi.model.LatLng; import com.zms.baidulbs.R; @@ -34,11 +45,13 @@ private InfoWindow mInfoWindow; private Marker mMarkerStart; private Marker mMarkerEnd; + private Button btnShare, btnBack; public double mRouteLatitude = 0.0; public double mRouteLongitude = 0.0; private final String ROUTE_PATH = "/sdcard/Route/"; + private String filePath = ""; private RouteAdapter routeAdapter = new RouteAdapter(); // 初始化全局 bitmap 信息,不用时及时 recycle @@ -51,13 +64,22 @@ protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.route_show); - String filePath = ""; + // Hide Status Bar + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); + + btnShare = (Button) findViewById(R.id.btnShare); + btnBack = (Button) findViewById(R.id.btnBack); + btnShare.setOnClickListener(new MyOnClickListener()); + btnBack.setOnClickListener(new MyOnClickListener()); + Bundle extras = getIntent().getExtras(); if (extras != null) { filePath = extras.getString("filePath"); - setTitle(filePath.substring(0, filePath.length() - 4)); + // setTitle(filePath.substring(0, filePath.length() - 4)); } else { Toast.makeText(getApplicationContext(), "轨迹文件不存在", Toast.LENGTH_SHORT).show(); @@ -71,6 +93,51 @@ protected void onCreate(Bundle savedInstanceState) { } + class MyOnClickListener implements View.OnClickListener { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btnShare: + mBaiduMap.snapshot(new SnapshotReadyCallback() { + public void onSnapshotReady(Bitmap snapshot) { + File file = new File(ROUTE_PATH + filePath + ".png"); + FileOutputStream out; + try { + out = new FileOutputStream(file); + if (snapshot.compress(Bitmap.CompressFormat.PNG, + 100, out)) { + out.flush(); + out.close(); + } + Intent intent = new Intent(Intent.ACTION_SEND); + Uri uri = Uri.fromFile(file); + intent.setType("image/png"); + intent.putExtra(Intent.EXTRA_STREAM, uri); + intent.putExtra(Intent.EXTRA_TITLE, "分享轨迹图到"); + Intent chooserIntent = Intent.createChooser(intent, + "分享轨迹"); + if (chooserIntent == null) { + return; + } + try { + startActivity(chooserIntent); + } catch (android.content.ActivityNotFoundException ex) { + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + break; + case R.id.btnBack: + finish(); + break; + } + } + } +
转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui
相关文章推荐
- Android 使用百度LBS SDK(五)
- Android使用百度LBS SDK(三)点击地图POI导航
- Android使用百度LBS SDK(二)
- Android 使用百度LBS SDK(四)
- Android 使用百度LBS SDK(六)轨迹回放
- 百度——LBS.云 v2.0——云检索AndroidSDK2.1.3版本的BUG
- 百度Android语音合成(TTS)SDK使用方法
- android中使用百度定位sdk实时的计算移动距离
- android-百度SDK使用实践
- 百度Android 定位SDK 的使用及错误
- Android应用程序实现定位功能(使用百度定位SDK)
- Android使用百度LBS定位服务
- Android开发百度SDK的使用--定位图层的使用
- android中使用百度定位sdk实时的计算移动距离
- Android使用百度定位SDK方法及错误处理
- 百度Android在线语音识别SDK使用方法
- Android使用GSP和百度SDK定位
- Android开发之百度SDK的使用--基础定位
- 申请百度提供的API Key,以在自己的Android应用程序中使用百度的LBS功能
- android中使用百度定位sdk实时的计算移动距离