在Android屏幕的上半部分显示带有图像的当前位置

时间:2012-08-09 06:58:13

标签: java android google-maps android-mapview locationmanager

在Android屏幕的上半部分,我正在显示谷歌地图,在Android屏幕的下半部分,我正在显示TextBox。

问题陈述 -

目前我正在top half of the Android Screen上显示谷歌地图,因此整个谷歌地图会显示在Top Half of the Android Screen上,但我需要将我的Current Location关注到Android的上半部分屏幕上显示我current_user.png中的图片drawable folder。所以这里的问题是 -

  1. 在Android屏幕的上半部分显示Current Location图片current_user.png
  2. 以下是我用来显示Android屏幕上半部分当前位置的Java代码。但它给了我例外,我的应用程序每次都被强制关闭。我在这里做错了什么?

    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
    

1 个答案:

答案 0 :(得分:2)

您必须像使用GPS提供商一样检查网络提供商是否已启用:

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

您的清单中还必须包含以下权限:

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