• Android定位&地图&导航——基于百度地图实现的定位功能


    一、问题描述

    LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位、地图、导航等,首先我们看如何基于百度地图实现定位功能

    二、配置环境

    1、注册密钥:地址http://developer.baidu.com/map/

    2、下载定位SDK,并导入SDK如图所示:

     

    三、编写MyApplication类

    编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中

    封装下列方法

    1、  获取定位信息——requestLocationInfo()

    2、  通过广播发送位置信息——sendBroadCast()

    3、  停止定位——stopLocationClient()

    public class MyApplication extends Application{
        public LocationClient mLocationClient = null;
        public GeofenceClient mGeofenceClient;
        public MyLocationListenner myListener = new MyLocationListenner();
        public static String TAG = "MyApplication";
        private static MyApplication mInstance = null;
        @Override
        public void onCreate(){
            mInstance = this;
            mLocationClient = new LocationClient(this);
            /**
             * 项目的key,自己到官网申请 http://lbsyun.baidu.com/apiconsole/key
             */
            mLocationClient.setAK("你的应用Key");
            mLocationClient.registerLocationListener(myListener);
            mGeofenceClient = new GeofenceClient(this);
            super.onCreate();
            Log.d(TAG, "... Application onCreate... pid=" + Process.myPid());
        }
        
        public static  MyApplication  getInstance(){
            return mInstance;
        }
    
        /**
         * 停止定位
         */
        public void stopLocationClient(){
            if (mLocationClient != null && mLocationClient.isStarted()){
                mLocationClient.stop();
            } 
        }
    
        /**
         * 发起定位
         */
        public void requestLocationInfo(){
            setLocationOption();
            if (mLocationClient != null && !mLocationClient.isStarted()){
                mLocationClient.start();
            }
            if (mLocationClient != null && mLocationClient.isStarted()){
                mLocationClient.requestLocation();
            } 
        }
    
        /**
         *  设置百度地图的相关参数
         */
        private void setLocationOption(){
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开gps
            option.setCoorType("bd09ll"); // 设置坐标类型
            option.setServiceName("com.baidu.location.service_v2.9");
            option.setPoiExtraInfo(true);
            option.setAddrType("all");
            option.setPoiNumber(10);
            option.disableCache(true);
            mLocationClient.setLocOption(option);
        }
    
        /**
         * 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中
         */
        public class MyLocationListenner implements BDLocationListener
        {
            @Override
            public void onReceiveLocation(BDLocation location){
                if (location == null){
                    sendBroadCast("定位失败!");
                    return;
                }
                sendBroadCast(location.getAddrStr());
            }
            public void onReceivePoi(BDLocation poiLocation){
                if (poiLocation == null){
                    sendBroadCast("定位失败!");
                    return;
                }
                sendBroadCast(poiLocation.getAddrStr());
            }
        }
        
        /**
         * 得到发送广播
         * @param address
         */
        public void sendBroadCast(String address){
                    stopLocationClient();
            Intent intent = new Intent(MainActivity.LOCATION_BCR);
            intent.putExtra("address", address);
            sendBroadcast(intent);
        }
    }
    三、 主程序MainActivity
    public class MainActivity extends Activity{
        public static String TAG = "LocTestDemo";
        private BroadcastReceiver broadcastReceiver;
        public static String LOCATION_BCR = "location_bcr";
        private Button locBtn;
        private TextView locInfo;
        private MyApplication application;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            application=(MyApplication)super.getApplication();
            initialize();
            initializeViews();
            initializeListeners();
        }
    
        private void initialize(){
            registerBroadCastReceiver();//注册广播
        }
        
        private void initializeViews()
        {
            locBtn = (Button) findViewById(R.id.location);
            locInfo = (TextView) findViewById(R.id.location_info);
        }
        
        private void initializeListeners()
        {
            locBtn.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    locInfo.setText("定位中...");
                //调用请求定位信息
                application.requestLocationInfo();
                }
            });
        }
    
        /**
         * 注册一个广播,监听定位结果,接受广播获得地址信息
         */
        private void registerBroadCastReceiver()
        {
            broadcastReceiver = new BroadcastReceiver(){
            public void onReceive(Context context, Intent intent){
                String address = intent.getStringExtra("address");
                    locInfo.setText(address);
                }
            };
            IntentFilter intentToReceiveFilter = new IntentFilter();
            intentToReceiveFilter.addAction(LOCATION_BCR);
            registerReceiver(broadcastReceiver, intentToReceiveFilter);
        }
        @Override
        protected void onDestroy(){
            super.onDestroy();
            unregisterReceiver(broadcastReceiver);
        }
    }
    四、 AndroidManifest.xml配置信息
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.jereh.baidulocation"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
        <application
            android:name="com.jereh.baidulocation.MyApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.jereh.baidulocation.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" >
                <intent-filter>
                    <action android:name="com.baidu.location.service_v2.2" >
                    </action>
                </intent-filter>
            </service>
        </application>
    
        <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>
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    </manifest>
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
     
  • 相关阅读:
    Linux curl命令详解
    Go语言获取命令行参数
    MySQL对sum()字段 进行条件筛选,使用having,不能用where
    PHP的 first day of 和 last day of
    easyui-datagrid个人实例
    easyui-layout个人实例
    easyui-combotree个人实例
    easyui-combo个人实例
    easyui-combotree个人实例
    easyui datagrid加载数据和分页
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4958060.html
走看看 - 开发者的网上家园