Показать текущее местоположение с изображением в верхней половине экрана Android

В моей верхней половине экрана Android я показываю карту Google, а в нижней половине экрана Android я показываю TextBox.

Постановка задачи-

Поскольку в настоящее время я показываю карту Google на top half of the Android Screen, вся карта Google отображается на Top Half of the Android Screen, но мне нужно сфокусировать Current Location на верхней половине экрана Android с изображением current_user.png, которое у меня есть на моем drawable folder. Так вот вопрос-

  1. Покажите Current Location с изображением current_user.png в верхней половине экрана Android.

Ниже приведен мой Java-код, который я использую для отображения текущего местоположения в верхней половине экрана Android. Но это дает мне исключение, и мое приложение каждый раз принудительно закрывается. Что-то не так, что я здесь делаю?

public class MainActivity extends MapActivity {    
public static final String TAG = "GoogleMapsActivity";
private MapView mapView;
private LocationManager locationManager;
Geocoder geocoder;
Location location;
LocationListener locationListener;
CountDownTimer locationtimer;
MapController mapController;
MapOverlay mapOverlay = new MapOverlay();



/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_main);
    initComponents();
    mapView.setBuiltInZoomControls(true);
    mapView.setSatellite(true);
    mapController = mapView.getController();
    mapController.setZoom(16);
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    if (locationManager == null) {
        Toast.makeText(getApplicationContext(),
                "Location Manager Not Available", Toast.LENGTH_SHORT)
                .show();
        return;
    }
    location = locationManager
    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if (location == null)
        location = locationManager
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    if (location != null) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        Toast.makeText(getApplicationContext(),
                "Location Are" + lat + ":" + lng, Toast.LENGTH_SHORT)
                .show();
        GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
        mapController.animateTo(point, new Message());
        mapOverlay.setPointToDraw(point);
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);
    }
    locationListener = new LocationListener() {
        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        }

        @Override
        public void onProviderEnabled(String arg0) {
        }

        @Override
        public void onProviderDisabled(String arg0) {
        }

        @Override
        public void onLocationChanged(Location l) {
            location = l;
            locationManager.removeUpdates(this);
            if (l.getLatitude() == 0 || l.getLongitude() == 0) {
            } else {
                double lat = l.getLatitude();
                double lng = l.getLongitude();
                Toast.makeText(getApplicationContext(),
                        "Location Are" + lat + ":" + lng,
                        Toast.LENGTH_SHORT).show();
            }
        }
    };
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 1000, 10f, locationListener);
    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener);
    locationtimer = new CountDownTimer(30000, 5000) {
        @Override
        public void onTick(long millisUntilFinished) {
            if (location != null)
                locationtimer.cancel();
        }

        @Override
        public void onFinish() {
            if (location == null) {
            }
        }
    };
    locationtimer.start();
}

public MapView getMapView() {
    return this.mapView;
}

private void initComponents() {
    mapView = (MapView) findViewById(R.id.mapView);
}

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

class MapOverlay extends Overlay {
    private GeoPoint pointToDraw;

    public void setPointToDraw(GeoPoint point) {
        pointToDraw = point;
    }

    public GeoPoint getPointToDraw() {
        return pointToDraw;
    }

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
        super.draw(canvas, mapView, shadow);

        Point screenPts = new Point();
        mapView.getProjection().toPixels(pointToDraw, screenPts);

        Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                R.drawable.current_user);
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null);
        return true;
    }
}

}

Ниже мой файл 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:layout_weight="1" 
        android:apiKey="0vAX8Xe9xjo5gkFNEEIH7KdHkNZNJWNnsjUPKkQ" 
        android:clickable="true" 
        android:enabled="true" /> 

    <TextView 
        android:id="@+id/textView" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_weight="1" 
        android:text="TextView" /> 

</LinearLayout> 

Исключение я получаю-

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example.circlemapandroid/com.example.circlemapandroid.MainActivity}: 
java.lang.IllegalArgumentException: requested provider network doesn't exisit

person arsenal    schedule 09.08.2012    source источник
comment
Если у вас есть fill_parent по высоте Map, то это не будет половина, потому что родитель означает, что LinearyLayout также является макетом «fill_parent. And parent might be making 100%». Итак, попробуйте изменить высоту MapView примерно на 300dp, чтобы просто проверить, применяется она или нет.   -  person Hamza Waqas    schedule 09.08.2012
comment
Но проблема в том, что это даже не начинается. И его каждый раз принудительно закрывают.   -  person arsenal    schedule 09.08.2012
comment
Оберните свой код Try Catch и поймайте строку исключения.   -  person Hamza Waqas    schedule 09.08.2012
comment
когда Служба отключена в Настройки › Местоположение и безопасность › определение местоположения по сети   -  person rajeshwaran    schedule 09.08.2012
comment
@ Rajeshwaran.T Что это значит, можете ли вы уточнить это поподробнее?   -  person arsenal    schedule 09.08.2012
comment
Я нашел кое-что очень интересное. Если я оберну все в onCreate method под блоком Try Catch, он начнет работать. И как только я уберу этот блок try catch. Он снова начал выдавать мне ошибку. Почему это так?   -  person arsenal    schedule 09.08.2012
comment
вы проверяете устройство или эмулятор?   -  person rajeshwaran    schedule 09.08.2012
comment
@rjchar, потому что он обрабатывает вашу ошибку, и если у вас ее нет, это становится причиной сбоя программы. Чисто?   -  person Hamza Waqas    schedule 09.08.2012
comment
@rjchar, извините, эмулятор поддерживает GPS. Не уверен в этом, но ошибка, о которой вы упомянули, связана с неверным адресом местоположения. Попробуйте Log.v(point);, потому что я сомневаюсь в ваших координатах.   -  person Hamza Waqas    schedule 09.08.2012
comment
включите спутники GPS в настройках служб определения местоположения --› Службы определения местоположения -- › спутники GPS.   -  person rajeshwaran    schedule 09.08.2012


Ответы (1)


Вы должны проверить, включен ли сетевой провайдер, как вы сделали с провайдером GPS:

if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
    locationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener);
}

Также в вашем манифесте должно присутствовать следующее разрешение:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
person Adam Monos    schedule 09.08.2012
comment
Позвольте мне попробовать этот сетевой провайдер, но настройка разрешений уже есть в моем файле манифеста, и я обнаружил очень странную вещь: если я оберну все в метод onCreate в Try Catch Block, он начнет работать. И как только я уберу этот блок try catch. Он снова начал выдавать мне ошибку. Почему это так? - person arsenal; 09.08.2012
comment
Вы получаете исключение, когда пытаетесь зарегистрировать сетевой прослушиватель, потому что в настройках Android провайдер сетевого местоположения отключен. Исключение конечно пропадает, когда ловишь его с помощью try-catch, но это не значит, что проблема решена. Вы просто проигнорировали это. - person Adam Monos; 09.08.2012