c#写手机安卓交互式地图(1)

来源:互联网 发布:淘宝卖家怎么处理退货 编辑:程序博客网 时间:2024/06/05 02:27

第一次写正式的博客,还是有点小激动。算是毕业设计的第一步,本文仅为记录过程及遇到的问题,同时我还只是一个c#和安卓的菜鸟,希望能通过记录自己得到提高。以下是正文。


采用的语言和工具

xamarin :基于C#与·NET框架的开源、跨平台实现。具体教程参考官网
vs2017:大家都懂得,安装xamarin开发包和自己需要的一些组件,包很大,大约30G,可以为自己换电脑加个理由。
百度地图sdk和api:因为不止要做移动端,还要定位服务器,所以也需要web开发的api,具体步骤要参考百度地图开发者中心的教程。其他需要的以后再加。

第一步开始

下载百度地图的SDK,创建Android绑定库项目,将jar文件和so文件放入jars文件夹下。修改jar文件属性中生成操作为EmbeddedJar,so文件属性生成操作为EmbeddedNativeLibrary。开始生成

接下来一定会有问题>_<

我感觉这是因为c#对jar包解析的不够准确,导致有重名方法,网上也有相关的一些说明,以下是我的解决办法,在metadata.xml文件里添加如下代码。

 <attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">AddressInfo</attr>  <attr path="/api/package[@name='com.baidu.mapapi']/class[@name='VersionInfo']/field[@name='VERSION_INFO']" name="name">VersionInformation</attr>  <attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='B']/field[@name='b']" name="name">BField</attr>  <attr path="/api/package[@name='com.baidu.platform.comapi.map']/class[@name='E']/field[@name='e']" name="name">EField</attr>  <attr path="/api/package[@name='com.baidu.mapapi.map']/interface[@name='BaiduMap.OnMapStatusChangeListener']/method[@name='onMapStatusChangeStart' and count(parameter)=2 and parameter[1][@type='com.baidu.mapapi.map.MapStatus'] and parameter[2][@type='int']]" name="managedName">OnMapStatusChangeStart2</attr>

个人感觉还是能够解决大多数问题。


APP制作开始,我在电脑上下了一个网易MOMO的虚拟机。别问我为什么不用真机调试(云OS伤不起),在和前面那个项目同一个解决方案下新建安卓空白应用,成功后添加引用,如下图
你看啥
项目->解决方案找到对应的项目名称。
然后开始撸代码。。。

第一次只是一个简单的地图展示更多功能请参阅百度地图帮助文档。

在布局中添加Mapview组件(好像不太推荐用这个了,不过这还是官方的示例)
在AndroidManifest.xml 添加如下代码,作用主要是获得权限

    <application android:allowBackup="true" android:label="@string/app_name">        <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你的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>

activity.cs改成

using Android.App;using Android.Widget;using Android.OS;using Com.Baidu.Location;using System.Text;using Com.Baidu.Mapapi;using Com.Baidu.Mapapi.Map;namespace NewMap{    [Activity(Label = "NewMap", MainLauncher = true)]    public class MainActivity : Activity    {        MapView mMapView = null;        protected override void OnCreate(Bundle savedInstanceState)        {            base.OnCreate(savedInstanceState);            SDKInitializer.Initialize(ApplicationContext);                       // Set our view from the "main" layout resource            SetContentView(Resource.Layout.Main);            mMapView = FindViewById<MapView>(Resource.Id.bmapView);        }        protected override void OnResume()        {            base.OnResume(); // Always call the superclass first.            mMapView.OnResume();        }        protected override void OnDestroy()        {            base.OnDestroy();            mMapView.OnDestroy();        }        protected override void OnPause()        {            base.OnPause();            mMapView.OnPause();        }    }}

OK 进行调试,MOMO的端口是7555,其他模拟器自己查。命令行执行adb connect 127.0.0.1:端口号。成功后就能找到你的模拟器,当然记得改最低支持版本,现在的模拟器安卓版本都比较低。就不上图了

阅读全文
0 0