2016-04-24 84 views
0

我想在谷歌地图上显示用户的当前位置,但截至目前我无法显示位置。我有一个片段,在其中编写代码。谷歌地图不显示当前位置在andorid?

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_home, container, false); 

     initGamp(rootView); 



     // Inflate the layout for this fragment 
     return rootView; 
    } 

initgmap功能

public void initGamp(View root) { 

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

     // check if map is created successfully or not 


    } 


@Override 
    public void onMapReady(GoogleMap googleMap) { 

     mMap = googleMap; 

     // Add a marker in Sydney, Australia, and move the camera. 
//  LatLng sydney = new LatLng(-34, 151); 
//  mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
//  mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
     if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     Log.i("MAP","BEFORE LOCATION"); 
     mMap.setMyLocationEnabled(true); 
     mMap.getUiSettings().setMyLocationButtonEnabled(true); 
     Log.i("MAP", "AFTER LOCATION"); 
     LocationManager locationManager = (LocationManager) getActivity().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     String bestProvider = locationManager.getBestProvider(criteria, true); 
     Location location = locationManager.getLastKnownLocation(bestProvider); 
     if (location != null) { 
      Toast.makeText(getActivity().getApplicationContext(),"not null",Toast.LENGTH_SHORT).show(); 
      onLocationChanged(location); 
     } 
     locationManager.requestLocationUpdates(bestProvider, 20, 0, this); 

     Log.i("MAP", "END LOCATION"); 



    } 

    @Override 
    public void onLocationChanged(Location location) { 

     Log.i("MAP","CHANGE LOCATION"); 
     Toast.makeText(getActivity().getApplicationContext(),"chnage",Toast.LENGTH_SHORT).show(); 
     mMap.clear(); 
     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 
     LatLng latLng = new LatLng(latitude, longitude); 
     mMap.addMarker(new MarkerOptions().position(latLng)); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); 


    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 


    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 

所有权限:

<!-- Required to show current location --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 

上面的代码我已经用于显示的位置,但我没有working.I也纷纷按钮当前的点按地点按钮,仍然不能获取当前位置。

+0

你清单中得到许可? –

+0

是的,我已经给@VivekMishra – Techiee

+0

它看起来像你没有在运行时请求位置权限,请参阅:http://stackoverflow.com/questions/34582370/how-can-i-use-google-maps-and -locationmanager-to-show-current-location-on-androi/34582595 –

回答

0

这里的关键是要等到onMapReady()回调发生在您请求位置更新之前。一旦在MapFragmentMapView对象上设置了此接口的实例,则可以在地图准备好使用并提供GoogleMap的非空实例时触发onMapReady(GoogleMap)方法。

以下是完整的Activity代码,可以满足您的需求。当活动加载时注册一个位置侦听器,然后每个位置发生更改事件。

下面是示例活动代码:

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

LocationRequest mLocationRequest; 
GoogleApiClient mGoogleApiClient; 

LatLng latLng; 
GoogleMap mGoogleMap; 
SupportMapFragment mFragment; 
Marker currLocationMarker; 

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

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

@Override 
public void onMapReady(GoogleMap gMap) { 
mGoogleMap = gMap; 
mGoogleMap.setMyLocationEnabled(true); 

buildGoogleApiClient(); 

mGoogleApiClient.connect(); 

} 

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 onConnect 
+0

你的代码不完整 – Techiee

+1

http://stackoverflow.com/a/33741294/4409409 –

相关问题