使用MapView-Android中的LocationName设置动画到某个位置

时间:2012-03-02 07:07:23

标签: android android-mapview

我正在尝试使用"位置名称"在 MapView 中为一个位置设置动画。这是一个国家名称"。我得到了例外: IOException: Service not Available, Couldn't get connection factory client.

如果您无法看到图片,那么例外是:: IOException:服务不可用,错误无法获得连接工厂客户端

我使用的代码如下:

public class ShowMapView extends MapActivity
{
    MapView mapView;
    MapController mapController;

String Country;

@Override
public void onCreate(Bundle bundleMap)
{
    super.onCreate(bundleMap);
    setContentView(R.layout.show_map);

    mapView = (MapView)findViewById(R.id.MapView);

    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);
    View zoomView = mapView.getZoomControls();

    zoomLayout.addView(zoomView,
            new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, 
            LayoutParams.WRAP_CONTENT));
    mapView.setBuiltInZoomControls(true);


    Intent intent = this.getIntent();
    Country = intent.getStringExtra("Country");

    Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    Log.v("GEOCODER", geocoder.toString());

    try
    {
        Log.v("MAP", "TRY BLOCK");
        List<Address> address = geocoder.getFromLocationName(Country, 2);
        Log.v("MAP", "Country: "  + Country);
        if(address.size() > 0)
        {
            Log.v("MAP", "GeoPoint p");
            GeoPoint p = new GeoPoint((int)(address.get(0).getLatitude() * 1E6),
                                      (int)(address.get(0).getLongitude() * 1E6));
            Log.v("MAP", "L&L done");
            mapController.animateTo(p);         Log.v("MAP", "Animate to P");
            mapView.invalidate();               Log.v("MAP", "Invalidate()");
        }
    }
    catch(IOException e)
    {
        Log.v("MAP", "CATCH BLOCK");
        e.printStackTrace();
    }
}
@Override
protected boolean isRouteDisplayed()
{
    Log.v("MAP", "ROUTE: false");
    return false;
    }
}

清单文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.project.LawSource"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <uses-library android:name="com.google.android.maps"/>

        <activity
            android:name=".GetCountry"
            android:label="@string/app_label" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name="ShowMapView" 
            android:label="@string/app_name">

        </activity>
    </application>

</manifest>

我已根据this tutorial工作,但它无法正常工作。

如果我遗失了某些内容,请告诉我。

我遇到的问题与this blog

中的问题相同

希望找到解决方案。

提前致谢,

HAPS。

2 个答案:

答案 0 :(得分:5)

StackOverflow上关于该异常的许多帖子,例如:Service not Available - Geocoder Android。它根本不是您的代码的问题,Geocoder会根据服务器可用性不时抛出此异常。您需要处理该例外,可能会回到使用Google Places API,如以下评论所示:https://stackoverflow.com/a/9173488/429047

获得GeoPoint后,可以使用MapController.animateTo(Geopoint) - http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html

一个简单的例子:

清单:

<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>


<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <uses-library android:name="com.google.android.maps"/>

    <activity
        android:name=".TestGeocoderActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>

main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey="<YOUR API KEY HERE>"
        android:clickable="true"
        android:drawingCacheQuality="auto"
        android:enabled="true" >
    </com.google.android.maps.MapView>

</LinearLayout>

TestGeocoderActivity.java

package com.rd.TestGeocoder;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class TestGeocoderActivity extends MapActivity {
    /** Called when the activity is first created. */
    MapView mapView;
    MapController mapController;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String country = "Australia";

        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mapController = mapView.getController();

        Intent intent = this.getIntent();
        if (intent.getStringExtra("country") != null) {
            country = intent.getStringExtra("country");
        }

        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        Log.v("GEOCODER", geocoder.toString());

        try {
            Log.v("MAP", "TRY BLOCK");
            List<Address> address = geocoder.getFromLocationName(country, 2);
            Log.v("MAP", "Country: " + country);
            if (address.size() > 0) {
                Log.v("MAP", "GeoPoint p");
                GeoPoint p = new GeoPoint(
                        (int) (address.get(0).getLatitude() * 1E6),
                        (int) (address.get(0).getLongitude() * 1E6));
                Log.v("MAP", "L&L done:"+p.toString());
                mapController.animateTo(p);
                Log.v("MAP", "Animate to P");
                mapView.invalidate();
                Log.v("MAP", "Invalidate()");
            }
        } catch (IOException e) {
            Log.v("MAP", "CATCH BLOCK");
            e.printStackTrace();
        }
    }

    @Override
    protected boolean isRouteDisplayed() {
        Log.v("MAP", "ROUTE: false");
        return false;
    }

}

显然你需要更改包名并填写api密钥

答案 1 :(得分:2)

最后它起作用了,我能够动画到一个位置, 这是完整的代码。

public class MapShowUsingJson extends MapActivity
{
    MapView mapView;
    MapController mapController;

    String country;  // Value of country is coming from other activity using Intent.

@Override
public void onCreate(Bundle bundle)
{
    super.onCreate(bundle);
    setContentView(R.layout.show_map);      
    mapView = (MapView)findViewById(R.id.MapView);
    //mapView.setBuiltInZoomControls(true);
    mapController = mapView.getController();

    Intent intent = this.getIntent();
    if(intent.getStringExtra("Country") != null)
        country = intent.getStringExtra("Country");
    else        
        Log.v("Intent Value", "Country:NULL");      

    Log.v("Country=", country);

    JSONObject object = getLocationInfo(country);

    GeoPoint p = getGeoPoint(object);

    mapController.animateTo(p);
    mapController.setZoom(4);
    mapView.invalidate();       
}

@Override
protected boolean isRouteDisplayed() 
{
    return false;
}

public static JSONObject getLocationInfo(String address)
{
    address = address.replaceAll(" ","%20");
    HttpGet httpGet = new HttpGet("http://maps.google."
            + "com/maps/api/geocode/json?address=" + address
            + "&sensor=false");

    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    try 
    {
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1)
        {
            stringBuilder.append((char) b);
        }
    } 
    catch (ClientProtocolException e)
    {
    }
    catch (IOException e)
    {
    }

    JSONObject jsonObject = new JSONObject();
    try 
    {
        jsonObject = new JSONObject(stringBuilder.toString());
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }

    return jsonObject;
}


public static GeoPoint getGeoPoint(JSONObject jsonObject)
{

    Double lon = new Double(0);
    Double lat = new Double(0);

    try {

        lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
            .getJSONObject("geometry").getJSONObject("location")
            .getDouble("lng");

        lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
            .getJSONObject("geometry").getJSONObject("location")
            .getDouble("lat");

    } 
    catch (JSONException e)
    {
        e.printStackTrace();
    }

    return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

}

}

使用此java代码并使用 Mo Kargas的答案中的所有xml文件代码。