Monodroid上的Google地图,Mac上的错误编译

时间:2012-01-30 15:09:37

标签: c# android google-maps xamarin.android

如何让它在Google的API 10(2.3.3)上运行xamarin的地图演示?我试图使用Monodroid提供的google maps api运行地图演示应用程序并且它不起作用,它总是出现Java .IO.Exception:27,Java.IO.Exception:28,依此类推。我试图从12月开始使用它,我没有看到任何解决方案。我正在使用Monodevelop IDE在Mac上工作。有没有人有办法解决吗?

编辑:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent" 
android:layout_height="match_parent">
<com.google.android.maps.MapView
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:enabled="true"
    android:clickable="true"
    android:apiKey="0oqo66omATbRfB2Wpsdf6Kpi9-fm88CsqwHauLg"
    />

以下是我对Manifest的许可:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="cdcsoftwareerpmobileandroid.cdcsoftwareerpmobileandroid">
<application android:label="CdcSoftware.ErpMobile.AndroidUI" android:debuggable="true">
</application>
<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>
<uses-sdk /></manifest>

这是MapActivity类,我评论了一行来测试两个选项:

public class MapAddress : MapActivity
{
    const String TAG = "MapViewCompassDemo";

    private SensorManager sensor_manager;
    private RotateView rotate_view;
    private MyLocationOverlay location_overlay;

    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);
        //SetContentView (Resource.Layout.mapview);


        // Get a reference to the sensor manager
        sensor_manager = (SensorManager) GetSystemService (Context.SensorService);

        // Create our view
        var map_view = new MapView (this, "0oqo66dsfTbRfB2Wp0Lr6Kpi9-fm88CsqwHauLg");

        rotate_view = new RotateView (this);
        rotate_view.AddView (map_view);

        SetContentView (rotate_view);

        // Create the location overlay
        location_overlay = new MyLocationOverlay (this, map_view);
        location_overlay.RunOnFirstFix (delegate {
            map_view.Controller.AnimateTo (location_overlay.MyLocation);
        });
        map_view.Overlays.Add (location_overlay);

        map_view.Controller.SetZoom(18);
        map_view.Clickable = true;
        map_view.Enabled = true;
    }

    protected override bool IsRouteDisplayed {
        get { return false; }
    }
}

注意:Api Key不是真正的。

2 个答案:

答案 0 :(得分:3)

我正在使用monodroid,我的地图正在运行..你正在运行演示?你有你的debug.kestore注册并获得谷歌地图API密钥开始?这是我试图让它工作时的一些笔记

Steps to obtain google map API key

=&GT; (注意:Debug.keystore存储在您的Xamarin文件夹中,与那些Java应用程序不同)

  1. 安装Google Inc. Sdk
  2. 获取签名密钥指纹
  3. 获取Map API密钥
  4. 在应用中使用Map API密钥
  5. 之后,要显示地图,请使用

    <com.google.android.maps.MapView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="[MY API KEY]" />
    

    或以编程方式:

    var map_view = new MapView (this, "[MY API KEY]");
    

    这意味着您需要替换Demo中的一些代码

    如果您正在使用Mono的MapDemo,那么只有带指南针的那个适用于我。但只需创建一个简单的地图应用程序,如他们和两种方法(将API密钥放在布局文件或代码中)都可以。

    编辑:

    对于权限,请将这些放在应用程序标记之外:

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.INTERNET" />
      <application></application>
    

    不确定这是否有必要,但在AssemblyInfo.cs

    [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
    

    对我来说,我只是在布局中加载地图,如下所示:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
      <Button
          android:id="@+id/Logout"
          android:layout_alignParentTop="true"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="@string/Logout"
        />
      <com.google.android.maps.MapView
          android:id="@+id/mapview"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_below ="@+id/Logout"
          android:layout_alignParentLeft="true"
          android:enabled="true"
          android:clickable="true"
          android:apiKey="API KEY"
            />
      <LinearLayout android:id="@+id/zoom"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true"
      />
    </RelativeLayout>
    

    并加载它:

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); ;
        SetContentView(Resource.Layout.mapview);
    ...
    }
    

    编辑:

    只是评论了一些部分以使代码正常工作:

    注意:

    1. 我认为传感器和RotateView有问题,因为我无法以这种方式工作。如果您使用RotateView并且只是动态地将mapview添加到linearLayout,它将起作用。目前,如果您还没有在应用中显示地图,则可以显示

    2. 我将SetContentView(Resource.Layout.Main)更改为我放置MapView布局的位置..只需将其更改回您的。

      public class MapAddress : MapActivity
      {
          const String TAG = "MapViewCompassDemo";
          //private SensorManager sensor_manager;
          //private RotateView rotate_view;
          //private MyLocationOverlay location_overlay;   
          protected override void OnCreate (Bundle savedInstanceState)
          {
              base.OnCreate (savedInstanceState);
              SetContentView (Resource.Layout.Main);
      
      
              // Get a reference to the sensor manager
          //    sensor_manager = (SensorManager) GetSystemService (Context.SensorService);
      
              // Create our view
        /*      var map_view = new MapView (this, "0oeB7V1XvegNHY25V5kJq0dsGz_HPbzZa-0WCkg");
      
              rotate_view = new RotateView (this);
              rotate_view.AddView (map_view);
      
              SetContentView (rotate_view);
      
              // Create the location overlay
              location_overlay = new MyLocationOverlay (this, map_view);
              location_overlay.RunOnFirstFix (delegate {
                  map_view.Controller.AnimateTo (location_overlay.MyLocation);
              });
              map_view.Overlays.Add (location_overlay);
      
              map_view.Controller.SetZoom(18);
              map_view.Clickable = true;
              map_view.Enabled = true;
              */
          }
      
          protected override bool IsRouteDisplayed {
              get { return false; }
          }
      }
      

答案 1 :(得分:2)

我意识到我的问题是我的apiKey,我从另一个目录得到我的指纹:〜/ .android / debug.keystore我并不认为这是问题,因为我生成它以获得我的apikey和我在我的Java android应用程序中使用它并且工作正常,但后来我尝试将其更改为位于此目录中的debug.store:$ HOME / .local / share / Xamarin / Mono for Android / debug.keystore,并抛出我另一个指纹,所以我用它来生成另一个apikey,然后神奇地在Mono上运行我的应用程序。但非常感谢你的帮助