Xamarin.Android 使用百度地图获取定位信息

  

  最近做一个项目,web端使用百度地图,PDA使用手持机自带的GPS定位系统获取经纬度,然后再百度地图上显示该经纬度会有一定距离的差异,这里就像可乐的瓶子拧上雪碧的盖子,能拧的上却不美观。所以为了数据的精确性,PDA端也用百度地图的接口。

  

  下面主要流程分为以下几步:

  1. 新建项目BaiduMapAPIDemo。
  2. 下载百度地图 --Android定位SDK 。
  3. Binging Labrary项目添加相关文件。
  4. 注册百度开发平台,创建应用,获取AK。
  5. 写入百度提供示例代码。
  6. 查看输出结果。

第一步:新建项目名为BaiduMapAPIDemo的项目

  解决方案右键——> 添加 ——> 新建项目 ——> 绑定库,名为BaiduMapAPI

  添加后呈现效果:

第二步:下载百度地图  Android定位SDK  http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all

  下载后的呈现效果:

第三步:在Jars文件夹下添加jar文件,并将jar文件的生成操作改为Embedded

  重新生成马上就会报这个错误:

  只需要打开项目BaiduMapAPI - Transforms文件夹 修改Metadata.xml文件为以下,就不会生成错误。

<metadata>
  <attr path="/api/package[@name=‘com.baidu.location‘]/class[@name=‘Address‘]/field[@name=‘address‘]" name="name">Addresses</attr>
</metadata>
  把下载的libs文件粘贴到Assets文件夹下,并将so文件的生成操作修改为AndroidNativeLibrary

   项目中呈现效果:

  然后对BaiduMapAPI添加引用

第四步:获取访问应用(AK)  http://lbsyun.baidu.com/apiconsole/key/create

SHA1获取方式:

  找到本机的Mono for Android的地址,我的是 C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android

  然后cmd命令行输入:cd /d C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android 然后再输入 keytool -list -v -keystore debug.keystore 然后就能获取SHA1了

  输入秘钥库口令直接空格可跳过。

  包名获取方式:AndroidManifest.xml 下的package中的值就是包名

  百度AK创建呈现

第五步:在Android项目中的AndroidManifest.xml文件中进行以下配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="BaiduMapAPIDemo.BaiduMapAPIDemo"
          android:versionCode="1"
          android:versionName="1.0">
  <uses-sdk android:minSdkVersion="21" />
  <application android:allowBackup="true" android:label="@string/app_name">
    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>
    <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="VsuhUI11WpW2kF" /> //key:开发者申请的Key
  </application> 

  <!-- 这个权限用于进行网络定位-->
  <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>
</manifest>

  在MainActivity.cs中引入Com.Baidu.Location , System.Text,并实现接口IBDLocationListener。

using System;
using Android.App;
using Android.OS;
using Com.Baidu.Location;
using System.Text;
using Android.Locations;
using System.Collections.Generic;
using Java.Util;
namespace BaiduMapAPIDemo
{
    [Activity(Label = "BaiduMapAPIDemo", MainLauncher = true)]
    public class MainActivity : Activity, IBDLocationListener
    {
        int count = 1;
        public LocationClient mLocationClient = null;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            mLocationClient = new LocationClient(ApplicationContext);     //声明LocationClient类
            mLocationClient.RegisterLocationListener(this);    //注册监听函数
            StartLocationService();
        }
        private void StartLocationService()
        {
            LocationClientOption option = new LocationClientOption();
            option.SetLocationMode(LocationClientOption.LocationMode.HightAccuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            option.CoorType = "bd09ll";//可选,默认gcj02,设置返回的定位结果坐标系
            int span = 1000;
            option.ScanSpan = span;//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
            option.SetIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
            option.OpenGps = true;//可选,默认false,设置是否使用gps
            option.LocationNotify = true;//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
            option.SetIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
            option.SetIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
            option.SetIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
            option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
            option.EnableSimulateGps = false;//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
            mLocationClient.LocOption = option;
            mLocationClient.Start();
        }
        public void OnReceiveLocation(BDLocation location)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("time : ");
            sb.Append(location.Time);
            sb.Append("\nerror code : ");
            sb.Append(location.LocType);
            sb.Append("\nlatitude : ");
            sb.Append(location.Latitude);
            sb.Append("\nlontitude : ");
            sb.Append(location.Longitude);
            sb.Append("\nradius : ");
            sb.Append(location.Radius);
            if (location.LocType == BDLocation.TypeGpsLocation)
            {// GPS定位结果
                sb.Append("\nspeed : ");
                sb.Append(location.Speed);// 单位:公里每小时
                sb.Append("\nsatellite : ");
                sb.Append(location.SatelliteNumber);
                sb.Append("\nheight : ");
                sb.Append(location.Altitude);// 单位:米
                sb.Append("\ndirection : ");
                sb.Append(location.Direction);// 单位度
                sb.Append("\naddr : ");
                sb.Append(location.AddrStr);
                sb.Append("\ndescribe : ");
                sb.Append("gps定位成功");
            }
            else if (location.LocType == BDLocation.TypeNetWorkLocation)
            {// 网络定位结果
                sb.Append("\naddr : ");
                sb.Append(location.AddrStr);
                //运营商信息
                sb.Append("\noperationers : ");
                sb.Append(location.Operators);
                sb.Append("\ndescribe : ");
                sb.Append("网络定位成功");
            }
            else if (location.LocType == BDLocation.TypeOffLineLocation)
            {// 离线定位结果
                sb.Append("\ndescribe : ");
                sb.Append("离线定位成功,离线定位结果也是有效的");
            }
            else if (location.LocType == BDLocation.TypeServerError)
            {
                sb.Append("\ndescribe : ");
                sb.Append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到[email protected],会有人追查原因");
            }
            else if (location.LocType == BDLocation.TypeNetWorkException)
            {
                sb.Append("\ndescribe : ");
                sb.Append("网络不同导致定位失败,请检查网络是否通畅");
            }
            else if (location.LocType == BDLocation.TypeCriteriaException)
            {
                sb.Append("\ndescribe : ");
                sb.Append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
            }
            sb.Append("\nlocationdescribe : ");
            sb.Append(location.LocationDescribe);// 位置语义化信息
            System.Collections.Generic.IList<Poi> list = location.PoiList;// POI数据
            if (list != null)
            {
                sb.Append("\npoilist size = : ");
                sb.Append(list.Count.ToString());
                foreach (Poi p in list)
                {
                    sb.Append("\npoi= : ");
                    sb.Append(p.Id + " " + p.Name + " " + p.Rank);
                }
            }
            System.Diagnostics.Debug.Write(sb.ToString());
        }

    }
}

第六步:查看输出结果

最后附上Demo地址:

  链接: https://pan.baidu.com/s/1uHB3whb_aW1uKhJ1v9FLeg

  密码: g4xr

记得要换成自己的AK哦~



原文地址:https://www.cnblogs.com/swjian/p/9036457.html

时间: 2024-10-06 01:13:42

Xamarin.Android 使用百度地图获取定位信息的相关文章

xamarin.android 绑定百度地图SDK遇到的问题

在 xamarin.android 绑定项目中,绑定 百度地图的LBS地图SDK,参考 https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-jar/ 设置好后,编译,  然后提示错误,其中一个错误 是 意思就是说转换 出来的CS 代码中,有重复的 类型. 理论上来说,转换的 CS 代码 是不应该出现重复代码的,有重复,意味这 jar有重复代码. 然后查看 百度地

android socket 百度地图 实时定位

Socket服务 首先开启一个启动Socket的服务 publicclassSocketNetService extends Service{ privatefinal String TAG = "SocketNetService"; publicstatic Thread NetThread; publicstatic Socket socket; private InetAddress address; publicstaticbooleanisFristConn = true;

百度地图获取地址信息由纬度和经度

谁是通过谷歌的坐标呼叫与谷歌api 近来的 罗总能找到谷歌server. 因此,要找到百度的发现, 住址http://developer.baidu.com/map/webservice-geocoding.htm#.E4.BB.80.E4.B9.88.E6.98.AFGeocoding.EF.BC.9F 逆地理编码演示样例 參数 值 Latitude: Longitude: pois(是否显示周边100米内poi):   不显示  显示  执行 (结果显演示样例如以下) http://api.

android使用百度地图SDK获取定位信息

本文使用Android Studio开发. 获取定位信息相对简单,我们只需要如下几步: 第一步,注册百度账号,在百度地图开放平台新建应用.生成API_KEY.这些就不细说了,请前往这里:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key 第二步,下载sdk,地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

android 基于百度地图api开发定位以及获取详细地址

一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView .设计代码如下: Xml代码   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&q

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终

Android 开发之集成百度地图的定位与地图展示

app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,最近也在做定位功能,但是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了很长时间来研究,今天来给大家分享下 Android 集成百度地图要注意的事情,这里只是集成了定位和地图展示功能,其他功能还未涉及,先看下效果图: 接下来介绍一下 Android 集成百度地图的步骤: 首先登陆百度开发平台,在我的应用中创建应用,然后你会看到如下界面: 根据它的要求填写相关信息,这里的安全是有 SHA

百度地图开发定位与显示Demo(Android)

百度地图给我们提供了非常丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新.地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本不兼容.本篇博文基于以上最新版本的API提供一个小例子:获取自己当前的经纬度坐标,并且显示在地图上.这里只给出核心代码,其他KEY的引入,地图控件的添加,权限的声明,定位服务的声明可在百度地图API官网(http://developer.baidu.com/map/sdkandev-download.h

Android使用百度地图出现闪退及定位时显示蓝屏问题

 目录 1.Android使用百度地图出现闪退 2.Android使用百度地图定位出现蓝屏问题     1.Android使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="D9Lh8MrrLMUuXdWMU8tRLtDsta6PoaYN" /> 但是