【问题标题】:Maps API only loads with location setting GPSMaps API 仅加载位置设置 GPS
【发布时间】:2015-07-16 07:32:08
【问题描述】:

我在我的 Android 应用中使用 Google Maps API 并通过 LocationManagergetLongitude()getLatitude()。 但是现在手机上必须有奇怪的设置才能得到地图。必须将位置设置更改为仅使用 GPS,即使如此,它也始终无法正常工作,有时地图无法加载。如果未加载,应用程序将在第一个标记被设置时关闭,因为NullPointerException

为什么会这样,我该如何预防? 我已经尝试过getMapAsync,但没有帮助。

GoogleMap googleMap;
LocationManager locationManager;
String provider;
Criteria criteria;
Location myLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

   try {
        if(googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        }
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setMyLocationEnabled(true);
        googleMap.setTrafficEnabled(true);
        googleMap.setIndoorEnabled(true);
        googleMap.setBuildingsEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, true);
        myLocation = locationManager.getLastKnownLocation(provider);
        double latitude = myLocation.getLatitude();
        double longitude = myLocation.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(14));
        iconDone = R.drawable.markerdone;
        icon = R.drawable.marker;
    }
    catch(Exception e) {
        e.printStackTrace();
    }

    Marker marker1 = googleMap.addMarker(new MarkerOptions()
            .position(new LatLng(49.793012, 9.926201))
            .title(getString(R.string.Title1))
            .snippet("")
            .icon(BitmapDescriptorFactory.fromResource(icon)));

【问题讨论】:

  • 显示您的代码,以便更好地了解您的问题发生的原因。你在使用 FusedLocationProvider 吗?
  • 第一次打开应用没有加载?还是在参加另一个活动/片段之后?并且它不会加载和崩溃(如果是这样,请发布您的 logcat)!还是加载时没有任何内容?请澄清你的问题。帮助我们帮助您

标签: android google-maps gps


【解决方案1】:

问题在于您正在调用getLastKnownLocation(),它会经常返回空位置,因为它没有明确请求新的位置锁定。

因此,当您的应用程序崩溃时,这是由于尝试取消引用 Location 对象时出现 NullPointerException。

最好请求位置更新,如果您只需要一个,只需在第一个 onLocationChanged() 回调到来时取消注册位置更新。

这是一个使用 FusedLocationProvider API 的示例,它会在需要时自动使用网络位置以及 GPS 位置:

Activity 的相关导入:

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

活动:

public class MainActivity extends AppCompatActivity 
        implements OnMapReadyCallback,
        GoogleApiClient.ConnectionCallbacks, 
        GoogleApiClient.OnConnectionFailedListener, LocationListener {


    GoogleMap googleMap;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    Marker marker;

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

        buildGoogleApiClient();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onResume() {
        super.onResume();

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

        mapFragment.getMapAsync(this);
    }

    protected synchronized void buildGoogleApiClient() {
        Toast.makeText(this,"buildGoogleApiClient", Toast.LENGTH_SHORT).show();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    @Override
    public void onMapReady(GoogleMap map) {

        googleMap = map;

        setUpMap();

    }

    public void setUpMap() {

        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.setMyLocationEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);

    }

    @Override
    public void onConnected(Bundle bundle) {

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10);
        mLocationRequest.setFastestInterval(10);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        //mLocationRequest.setSmallestDisplacement(0.1F);

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onLocationChanged(Location location) {

        //unregister location updates
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

        //remove previously placed Marker
        if (marker != null) {
            marker.remove();
        }

        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        //place marker where user just clicked
        marker = googleMap.addMarker(new MarkerOptions()
                .position(latLng)
                .title("Current Location")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(latLng).zoom(5).build();

        googleMap.animateCamera(CameraUpdateFactory
                .newCameraPosition(cameraPosition));


    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

}

build.gradle(更改为您当前使用的任何版本的 Google Play 服务):

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.google.android.gms:play-services:7.5.0'
}

布局 xml 中的 SupportMapFragment(您也可以使用 MapFragment):

    <fragment
    android:id="@+id/map"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

仅使用网络位置:

地图在发射几秒后移动到当前位置:

【讨论】:

  • 我像你一样做了所有事情,但是在 onLocationChanged 方法上它给了我一个错误,说“方法没有覆盖其超类中的方法”
  • 如果我使用其中的当前位置知道用户在标记附近,你会在哪里设置setOnInfoClickListener
  • @maidi 我刚刚更新了格式,这样你就可以在不滚动的情况下看到 Activity 实现的所有接口,看看吧!还要确保导入正确的 LocationListener:import com.google.android.gms.location.LocationListener;
  • @maidi for setOnInfoWindowClickListener 看到这个答案,在setUpMap() 中设置它:stackoverflow.com/questions/29976663/…
  • 我和你一样在onLocationChanged()中设置了当前位置并命名为myposition。现在我想在onWindowClickListener 中使用它,并以相同的方式设置一个带有setLatitude(myposition.latitude) 和经度的位置变量。有了这个Location 变量,我使用distanceTo。 (这是我在添加您的解决方案之前所做的方式)。这是错误的做法吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-13
  • 2018-11-18
  • 2014-12-15
  • 2018-01-06
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多