2

In my Top Half of the Android Screen, I am showing Google Map and in the Bottom Half of the Android Screen, I am showing TextBox.

Problem Statement-

As currently I am showing google map on the top half of the Android Screen, so whole google map is getting shown on the Top Half of the Android Screen but I need to focus my Current Location on the Top Half of the Android Screen with the image current_user.png that I have in my drawable folder. So question here is-

  1. Show the Current Location with the image current_user.png on the Top Half of the Android Screen.

Below is my Java Code that I am using to show the current location on Top Half of the Android Screen. But it is giving me exception and my application is getting forced closed every time. Is there anything wrong I am doing here?

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;
    }
}

}

Below is my XML file

<?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> 

Exception I am getting-

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example.circlemapandroid/com.example.circlemapandroid.MainActivity}: 
java.lang.IllegalArgumentException: requested provider network doesn't exisit
arsenal
  • 23,366
  • 85
  • 225
  • 331
  • If you have `fill_parent` in your height of the `Map` then it wouldn't be half because the parent means `LinearyLayout` is also 'fill_parent`. And parent might be making `100%` layout. So, try changing the height of `MapView` something like `300dp` to just test it is applying or not. – Hamza Waqas Aug 09 '12 at 07:02
  • But the problem is, it is not even getting started. And it is getting forced closed everytime. – arsenal Aug 09 '12 at 07:03
  • Wrap your code with `Try Catch` and catch the see the exception line. – Hamza Waqas Aug 09 '12 at 07:03
  • when the Service is disabled in Settings > Location and Security > location through network – rajeshwaran Aug 09 '12 at 07:05
  • @Rajeshwaran.T What does that mean, Can you elaborate this more? – arsenal Aug 09 '12 at 07:11
  • I found something very interesting. If I wrap everything in `onCreate method` under Try Catch Block, it started working. And as soon as I remove that try catch block. It started giving me the error again. Why is it so? – arsenal Aug 09 '12 at 07:12
  • you check device or emulator? – rajeshwaran Aug 09 '12 at 07:12
  • @rjchar, because it is handling your error and if you don't have it, it makes the cause of program crash. clear? – Hamza Waqas Aug 09 '12 at 07:16
  • @rjchar, if I am sorry, emulator supports `GPS`. Not sure about it but the error you mentioned is something about invalid location address. Try `Log.v(point);` because I'm doubtful about your coordinates. – Hamza Waqas Aug 09 '12 at 07:17
  • enable gps satellites in location services settings-->Location services--> gps satellites. – rajeshwaran Aug 09 '12 at 07:19

1 Answers1

2

You have to check if network provider is enabled like you did with the GPS provider:

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

Also the following permission have to be present in your manifest:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Adam Monos
  • 4,287
  • 1
  • 23
  • 25
  • Let me try that network provider thing, but the permission setting is already there in my manifest file and I found very strange thing-- If I wrap everything in onCreate method under Try Catch Block, it started working. And as soon as I remove that try catch block. It started giving me the error again. Why is it so? – arsenal Aug 09 '12 at 07:15
  • You get the exception when you try to register the network listener, beacuse in the Android settings the network location provider is turned off. Ofcourse the exception is gone, when you catch it with try-catch, but that doesn't mean, that the problem is solved. You just ignored it. – Adam Monos Aug 09 '12 at 07:22