您的位置:首页 > 移动开发 > Android开发

Android基于位置的服务开发,百度地图的使用

2015-09-22 21:49 826 查看
领卓教育培训第七十一天

简介

基于位置的服务LBS(Location Based Server),这是只有在移动设备上才能实现的技术,由于移动设备可以随身携带,我们通过地理定位的技术就可以随时得知自己所在的位置。主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定移动设备所在的位置。

下面主要就百度地图显示,定位等做一些简单的介绍

使用百度地图

申请APIkey

首先要注册一个百度账号,然后登陆百度账号,然后到百度地图API页面,注册成为一名百度开发者。然后创建应用,选择应用类型Android SDK,然后输入安全码即可。

操作具体过程:

http://developer.baidu.com/map/index.php?title=androidsdk/guide/key

地图

环境配置

首先下载Android地图SDK,解压。然后配置环境。以Android Studio为例:

**第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。

第二步:导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。**

操作具体过程:

http://developer.baidu.com/map/index.php?title=androidsdk/guide/buildproject

显示地图

第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

(2)添加所需权限

第三步,在布局xml文件中添加地图控件;

第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:

第五步,创建地图Activity,管理地图生命周期;

操作具体过程:

http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap

定位

环境配置

同样的首先下载Android定位SDK,解压。然后配置环境。把jar包拷入libs文件中,将so包拷入jniLibs文件中,最后导入jar包。过程跟上面的一样。

实现定位

第一步:在application标签中声明service组件,每个app拥有自己单独的定位service

[code]<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>


第二步:声明使用权限

第三步:设置AcessKey

[code]<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="key" />       //key:开发者申请的key


第四步:使用综合定位功能

1. 初始化LocationClient类

LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context

2. 配置定位SDK参数

设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

3. 实现BDLocationListener接口

BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。

4. 开始定位。

start():启动定位SDK。 stop():关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。

操作具体过程:

http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

代码示例

环境的配置就不再赘述,声明的权限和服务组件也不再重复。

下面主要让我们输出一个城市和具体的地址,点击开始搜索按钮,地图显示并标记出来,然后点击定位按钮,显示并标记当前位置,最后点击开始连线,将两地连接起来。

我们的布局:

[code]<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/edit_city"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="城市"/>
        <EditText
            android:id="@+id/edit_address"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="地址"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/button_ss"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始搜索"/>
        <Button
            android:id="@+id/button_dw"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始定位"/>
        <Button
            android:id="@+id/button_lx"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始连线"/>
    </LinearLayout>
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
</LinearLayout>


然后是主活动的代码:

[code]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.Toast;
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 com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mMapView;
    private GeoCoder mSearch; // 搜索模块,也可去掉地图模块独立使用
    private BaiduMap mBaiduMap;
    private List<LatLng> points;
    private LocationClient mLocationClient;
    private BDLocationListener myListener;

    @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);
        mBaiduMap = mMapView.getMap();
        points = new ArrayList<LatLng>();
        myListener = new MyLocationListener();
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
        mLocationClient.registerLocationListener(myListener);    //注册监听函数

        // 初始化搜索模块,注册事件监听
        mSearch = GeoCoder.newInstance();
        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.icon_marka)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
                        .getLocation()));
                String strInfo = String.format("纬度:%f 经度:%f",
                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
                points.add(geoCodeResult.getLocation());
                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {

            }
        });

        Button button_ss = (Button) findViewById(R.id.button_ss);
        button_ss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText editText_city = (EditText) findViewById(R.id.edit_city);
                EditText editText_address = (EditText) findViewById(R.id.edit_address);
                mSearch.geocode(new GeoCodeOption().city(
                        editText_city.getText().toString()).address(
                        editText_address.getText().toString()));
            }
        });

        Button button_dw = (Button) findViewById(R.id.button_dw);
        button_dw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initLocation();
                mLocationClient.start();
            }
        });
        Button button_lx = (Button) findViewById(R.id.button_lx);
        button_lx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 添加折线
                OverlayOptions ooPolyline = new PolylineOptions().width(10)
                        .color(0xAAFF0000).points(points);
                mBaiduMap.addOverlay(ooPolyline);
            }
        });
    }

    @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();
    }

    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
        int span = 1000;
        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
        option.setOpenGps(true);//可选,默认false,设置是否使用gps
        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
        mLocationClient.setLocOption(option);
    }

    class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) {
                LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
                points.add(point);
                mBaiduMap.addOverlay(new MarkerOptions().position(point)
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.icon_marka)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));
                mLocationClient.stop();
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: