【问题标题】:Android Google Map Shows Grey Tiles in Satellite ViewAndroid 谷歌地图在卫星视图中显示灰色瓷砖
【发布时间】:2016-11-19 06:52:25
【问题描述】:

我正在尝试使用 Google Maps API 来显示“正常”视图和卫星视图。

我的应用可以在普通视图中显示任何位置,但当我将视图更改为卫星视图时仅显示灰色图块。

普通视图

卫星视图

这是我目前用来在视图之间切换的代码:

public class MapActivity extends BaseActivity implements OnMapReadyCallback {

    Geocoder geocoder;
    GoogleMap mMap;
    private static final int ERROR_DIALOGUE_REQUEST = 9001;
    private static final CharSequence[] MAP_TYPE_ITEMS = {"Road Map", "Hybrid", "Satellite", "Terrain"};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        //initialize geocoder
        geocoder = new Geocoder(getApplicationContext());

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search_menu,menu);
        MenuItem searchViewItem = menu.findItem(R.id.search_bar);
        final SearchView searchViewAndroidActionBar = (SearchView) MenuItemCompat.getActionView(searchViewItem);
        searchViewAndroidActionBar.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
            @Override
            public boolean onQueryTextSubmit(String query){

                try {
                    List<Address> location = geocoder.getFromLocationName(query, 1);
                    double lat = Double.parseDouble(String.valueOf(location.get(0).getLatitude()));
                    double lon = Double.parseDouble(String.valueOf(location.get(0).getLongitude()));

                    LatLng newLocation = new LatLng(lat,lon);

                    mMap.clear();
                    mMap.addMarker(new MarkerOptions().position(newLocation));
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newLocation,15));
                } catch (Exception e){
                    e.printStackTrace();
                }

                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText){
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();

        switch (id){
            case R.id.changeMapType:
                showMapTypeSelectorDialog();
                break;
        }
        return true;
    }

    private void showMapTypeSelectorDialog(){
        //setting up the builder
        final String title = "Select Map Type";
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);

        //check current map type
        int checkCurrentMapType = mMap.getMapType() - 1;

        //add click listener to dialog
        builder.setSingleChoiceItems(MAP_TYPE_ITEMS,checkCurrentMapType,new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item){
                switch(item){
                    case 1:
                        mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                        break;
                    case 2:
                        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
                        break;
                    case 3:
                        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                        break;
                    default:
                        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                }
                dialog.dismiss();
            }
        });

        //build dialog
        AlertDialog fMapTypeDialogue = builder.create();
        fMapTypeDialogue.setCanceledOnTouchOutside(true);
        fMapTypeDialogue.show();
    }

    public boolean servicesOK() {

        int isAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        if (isAvailable == ConnectionResult.SUCCESS){
            return true;
        } else if (GooglePlayServicesUtil.isUserRecoverableError(isAvailable)){
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(isAvailable, this, ERROR_DIALOGUE_REQUEST);
            dialog.show();
        } else {
            Toast.makeText(this, "Can't connect to mapping service", Toast.LENGTH_SHORT).show();
        }

        return false;
    }

    @Override
    public void onMapReady(GoogleMap map){
        mMap = map;

        LatLng initialLocation = new LatLng(1.366898,103.814047);
        mMap.addMarker(new MarkerOptions().position(initialLocation));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(initialLocation,10));
    }
}

我做错了什么? (已编辑以显示完整活动)

【问题讨论】:

  • 发布您的完整活动或片段课程
  • 发布了我的完整地图活动
  • 你使用的是虚拟设备还是真实设备?
  • 我正在使用虚拟设备,因为我现在无法访问真实设备
  • 你应该在真实设备上运行应用程序并检查行为

标签: android google-maps


【解决方案1】:

检查并尝试一下

设置地图类型后添加

builder.setSingleChoiceItems(MAP_TYPE_ITEMS,checkCurrentMapType,new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item){
                switch(item){
                    case 1:
                        mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                        mMap.invalidate();
                        break;
                    case 2:
                        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
                        mMap.invalidate();
                        break;
                    case 3:
                        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                         mMap.invalidate(); 
                        break;
                    default:
                        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                        mMap.invalidate();
                }
                dialog.dismiss();
            }
        });

同时在 onMapReady 中设置默认地图类型

 @Override
    public void onMapReady(GoogleMap map){
        mMap = map;
        // set default map here
         mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
         mMap.invalidate();
        LatLng initialLocation = new LatLng(1.366898,103.814047);
        mMap.addMarker(new MarkerOptions().position(initialLocation));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(initialLocation,10));
    }

【讨论】:

  • 我在尝试此操作时收到错误 Cannot resolve method 'invalidate()'
【解决方案2】:

MAP_TYPE_ITEMS的顺序和开关不同。点击卫星时,显示的是地形 try this link

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多