Анимируйте местоположение с помощью LocationName в MapView-Android - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь анимировать в 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>

Я работал в соответствии с этим руководством , но он не работает должным образом.

Дайте мне знать, если я что-то упустил.

У меня проблема такая же, как в этом блоге

Надеясь на решение.

Заранее спасибо,

Haps.

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Многие сообщения в StackOverflow об этом исключении, такие как: Сервис недоступен - Geocoder Android . Это может не быть проблемой с вашим кодом вообще, геокодер будет время от времени выдавать это исключение в зависимости от доступности сервера. Вам нужно будет обработать это исключение, возможно, вернувшись к использованию 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

2 голосов
/ 07 марта 2012

Наконец-то это сработало, я могу анимировать местоположение, вот полный код.

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 и используйте все коды XML-файлов Мо Каргаса Ответ.

...