Android Google Maps GroundOverlay from Bitmap appears white

孤人 提交于 2019-12-25 09:34:40

问题


I am trying to display a ground overlay downloaded from url.

the problem is that the image is not shown and the overlay appears as white square.

thinking the Bitmap Object is faulty i tested:

  1. addding the same bitmap Object to a marker - the marker shows o.k

  2. get an image with .fromResource(R.id.myimage) - the overlay shows o.k

but my image is from downloaded Bitmap Object.

This is my code:

private void addOverlayFromBitmap(Bitmap bmImage){
        BitmapDescriptor image = BitmapDescriptorFactory.fromBitmap(bmImage);
        //image = BitmapDescriptorFactory.fromResource(R.drawable.radaraimage9);

        //Set Anchors
        LatLng NE_ANCHOR = new LatLng(34.516481,37.679488);
        LatLng SW_ANCHOR = new LatLng(29.474814,31.876530);

        //Set Bounds
        LatLngBounds bounds = new LatLngBounds(SW_ANCHOR,NE_ANCHOR);

        // Append Overlay to map - image appears as white square
        map.addGroundOverlay(new GroundOverlayOptions()
             .image(image)
             .positionFromBounds(bounds)
             .transparency((float) 0.5));

        //add marker for debugging - image appears fine
        map.addMarker(new MarkerOptions()
                .position(NORTH_EAST_ANCHOR)
                .icon(image)
                );
}

The AsyncTask:

private class LoadRadarImageryTask extends AsyncTask<String, Void, Bitmap> {
    Bitmap bmImage;

    public LoadRadarImageryTask() {
        super();
    }

    protected Bitmap doInBackground(String... urls) {
        String url = urls[0];
        Bitmap image = null;
        try {
            InputStream in = new java.net.URL(url).openStream();
            image = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return image;
    }

    protected void onPostExecute(Bitmap image) {
        addOverlayFromBitmap(image);
    }
}

回答1:


It may be a problem of using large images means higher resolution. It could be suggested by your log cat so can you paste your log cat here.

OR

Try using Tile Overlay instead of ground overlay.

OR

use this code which worked for me in same problem..

import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.util.Log;
    import android.util.TypedValue;
    import android.view.Menu;
    import android.view.MenuItem;





    public class MapDisplayActivity extends FragmentActivity implements         OnMapClickListener, OnMapLongClickListener  {
    private GoogleMap myMap;

    private static  LatLng SearchPlace;
    double Latitude;
    double Longitiude;
    List<Address> addresses;

    //Address location;
    BitmapDescriptor image;
/// private static final LatLng NEWARK = new LatLng(18.5236, 73.8478);


        private GroundOverlay mGroundOverlay;

        //this is for omnistarg dont touch this 
        LatLng southwest= new LatLng(-85.513398,-178.242187);

        LatLng northeast= new LatLng(85.513398,178.242187);

     float zoomValue = 7.0f;
    private String SpinerValue;
    private Bitmap bitmap;
        @Override
        `enter code here`protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mapactivity);
    //VMRuntime.getRuntime().setMinimumHeapSize(4 * 1024 * 1024);
    Log.v("Utils", "Max mem in MB : " +    (Runtime.getRuntime().maxMemory()/(1024*1024)));
    Runtime.getRuntime().maxMemory();
    Debug.getNativeHeapSize();

    initActionBar();

    //textInfo=(TextView)findViewById(R.id.locinfo);

       FragmentManager myFragmentManager = getSupportFragmentManager();
       SupportMapFragment mySupportMapFragment 
        = (SupportMapFragment)myFragmentManager.findFragmentById(R.id.map);
       myMap = mySupportMapFragment.getMap();





      // myMap.setMyLocationEnabled(true);


      // myMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
       myMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
      // myMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
       //myMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);


       myMap.setOnMapClickListener(this);
       myMap.setOnMapLongClickListener(this);
       myMap.getUiSettings().setZoomControlsEnabled(true);
       myMap.getUiSettings().setMyLocationButtonEnabled(true);

       Intent intent=getIntent();
       Latitude=intent.getDoubleExtra("Latitude", 0.000);
       Longitiude=intent.getDoubleExtra("Longititude", 0.000);
       SpinerValue=(String)intent.getStringExtra("SPINNERVALUE");

       SearchPlace = new LatLng(Latitude, Longitiude);

       myMap.moveCamera(CameraUpdateFactory.newLatLng(SearchPlace));
       myMap.addMarker(new   MarkerOptions().position(SearchPlace));//.title(PlaceName));
       drawImageOverMap();




}



public void drawImageOverMap(){

       myMap.animateCamera(CameraUpdateFactory.zoomTo(zoomValue));

            //image =BitmapDescriptorFactory.fromResource(R.drawable.omnistar_g);
       if(SpinerValue.equalsIgnoreCase("TEC")){
           //centerpoint_vrs
           bitmap =   (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.omnistar_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    //.transparency(0.4f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));

       }
       else if(SpinerValue.equalsIgnoreCase("OmniSTARG2")){
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.omnistar_g_img);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.4f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       else if(SpinerValue.equalsIgnoreCase("OmniStarHP")){
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.omnistar_hp_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.4f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       /////////////////////////////////////////////
       else if(SpinerValue.equalsIgnoreCase("OmniStarVBS")){
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.omnistar_vbs_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.4f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));

       }
       else if(SpinerValue.equalsIgnoreCase("OmniSTARXP")){
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.omnistar_xp_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.4f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       else if(SpinerValue.equalsIgnoreCase("RTXStandardviaCellular")){
          //rtxcell 
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.rtx_cell_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.3f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       else if(SpinerValue.equalsIgnoreCase("RTXFastviaSatellite")){
           //rtxfast.png
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.rtx_fast_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.3f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       else if(SpinerValue.equalsIgnoreCase("RTXStandardviaSatellite")){
           //rtxsat.png
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.rtx_sat_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.3f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
       else if(SpinerValue.equalsIgnoreCase("VRSNow")){
           //vrsnowtec.png
           bitmap = (Bitmap)BitmapFactory.decodeResource(this.getResources(), R.drawable.vrsnow_tec_two);


            BitmapFactory.Options o2 = new BitmapFactory.Options();
             o2.inSampleSize=4;
             image=BitmapDescriptorFactory.fromBitmap(bitmap);
                LatLngBounds bounds =new LatLngBounds( southwest,  northeast);


                mGroundOverlay  = myMap.addGroundOverlay(new GroundOverlayOptions()
                    .image(image)
                    .transparency(0.3f)

                    //.anchor(0, 1)
                    .positionFromBounds(bounds));
       }
                    // InputStream is =getClass().getResourceAsStream(omnistar_g);
                    //bitmap = readAssetsBitmap("omnistar_g.png");
                     //bitmap =  BitmapFactory.decodeResource(this.getResources(), R.drawable.trimble_screen_logo);
                     //bitmap=bitmap(is);


                     //image =BitmapDescriptorFactory.fromResource(R.drawable.omnistar_g);


                             bitmap.recycle();
                             bitmap = null;
                             System.gc();
                             Runtime.getRuntime().gc(); 



}


来源:https://stackoverflow.com/questions/20373728/android-google-maps-groundoverlay-from-bitmap-appears-white

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!