我在23个以下设备中获得当前位置,但在23个仿真器设备中获得(0.0,0.0)纬度和经度.
编辑 目前我正在使用融合位置提供程序获取当前位置
public class ContactUsFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("TAG", "OnCreate Called"); locationManager = (LocationManager) getActivity() .getSystemService(Context.LOCATION_SERVICE); buildGoogleApiClient(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { // Inflate the layout for this fragment view = inflater.inflate(R.layout.fragment_contact_us, container, false); Log.i("TAG", "OnCreateView Called"); setComponants(view); // **** Method For Set Componants Of Layout
这是点击它的Map Image我想获得当前位置并将其传递给设备的Native Google Map应用程序以导航到目标位置
mapImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("TAG", "On ImageView Click"); if (Build.VERSION.SDK_INT >= 23) { if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getActivity().getApplicationContext(), getActivity())) { if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { navigateToGoogleMap(); } else { showSettingsAlert(); } } else { requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, PERMISSION_REQUEST_CODE, getActivity().getApplicationContext(), getActivity()); } } else { if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { navigateToGoogleMap(); } else { showSettingsAlert(); } } } }); return view; }
以下是获取当前位置的代码
private synchronized void buildGoogleApiClient() { Log.i("TAG", "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); createLocationRequest(); } private void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL); mLocationRequest.setFastestInterval(FASTEST_INTERVAL); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); builder = new LocationSettingsRequest.Builder() .addLocationRequest(mLocationRequest); //************************** builder.setAlwaysShow(true); //this is the key ingredient //************************** } @Override public void onConnected(Bundle bundle) { Location mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); // Note that this can be NULL if last location isn't already known. if (mCurrentLocation != null) { // Print current location if not null Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); currentlatitude = mCurrentLocation.getLatitude(); currentlongitude = mCurrentLocation.getLongitude(); } // Begin polling for new location updates. startLocationUpdates(); } private void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } private void stopLocationUpdates() { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } @Override public void onConnectionSuspended(int i) { if (i == CAUSE_SERVICE_DISCONNECTED) { Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); } else if (i == CAUSE_NETWORK_LOST) { Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show(); } mGoogleApiClient.connect(); } @Override public void onLocationChanged(Location location) { String msg = "Updated Location: " + Double.toString(location.getLatitude()) + "," + Double.toString(location.getLongitude()); Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); currentlatitude = location.getLatitude(); currentlongitude = location.getLongitude(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { }
*当我在下面的API23设备中使用时,此代码正常工作,但当我尝试使用marshmallow设备时,它会给出当前位置0.0,0.0*
下面是我的清单文件
小智.. 10
使用以下代码.希望这很有用.
确保仅将此代码运行到实际设备中.
activity_main.xml中
MainActivity.java
import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; 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.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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 mGoogleMap; SupportMapFragment mapFrag; LocationRequest mLocationRequest; GoogleApiClient mGoogleApiClient; Location mLastLocation; Marker mCurrLocationMarker; LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { checkLocationPermission(); } else { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } } mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFrag.getMapAsync(this); } private void showGPSDisabledAlertToUser() { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?") .setCancelable(false) .setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(callGPSSettingIntent); mapFrag.getMapAsync(MainActivity.this); } }); alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = alertDialogBuilder.create(); alert.show(); } @Override public void onPause() { super.onPause(); //stop location updates when Activity is no longer active if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap=googleMap; mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); //Initialize Google Play Services if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } } else { buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } @Override public void onConnected(Bundle bundle) { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(1000); mLocationRequest.setFastestInterval(1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } @Override public void onConnectionSuspended(int i) {} @Override public void onConnectionFailed(ConnectionResult connectionResult) {} @Override public void onLocationChanged(Location location) { mLastLocation = location; if (mCurrLocationMarker != null) { mCurrLocationMarker.remove(); } //Place current location marker LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("Current Position"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); //move map camera mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(11)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; public boolean checkLocationPermission() { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. //Prompt the user once explanation has been shown ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } return false; } else { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } return true; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } if (mGoogleApiClient == null) { buildGoogleApiClient(); } mGoogleMap.setMyLocationEnabled(true); } } else { // permission denied, boo! Disable the // functionality that depends on this permission. Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); } return; } // other 'case' lines to check for other // permissions this app might request } } }
AndroidManifest.xml中
Vishal Thakk.. 6
经过一些调试和搜索,我遇到了确切的问题
GoogleAPIclient onConnected()未调用,因此它调用了onConnectionFailed()方法
在那个方法中,我发现它是2的错误代码,这意味着需要播放服务更新
所以我在gradle文件中更改播放服务,与Device Playservice版本相同,因此我获得当前位置
我在这里发布一些代码:
private synchronized void buildGoogleApiClient() { Log.i("TAG", "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); createLocationRequest();} private void createLocationRequest() { Log.i("TAG", "CreateLocationRequest"); mLocationRequest = new LocationRequest(); long UPDATE_INTERVAL = 10 * 1000; mLocationRequest.setInterval(UPDATE_INTERVAL); long FASTEST_INTERVAL = 10000; mLocationRequest.setFastestInterval(FASTEST_INTERVAL); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); builder = new LocationSettingsRequest.Builder() .addLocationRequest(mLocationRequest); //************************** builder.setAlwaysShow(true); //this is the key ingredient //************************** } private void startLocationUpdates() { Log.i("TAG", "StartLocationUpdates"); if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } else { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } private void stopLocationUpdates() { Log.i("TAG", "StopLocationUpdates"); LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } @Override public void onConnectionSuspended(int i) { Log.i("TAG", "onConnectionSuspended"); if (i == CAUSE_SERVICE_DISCONNECTED) { Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); } else if (i == CAUSE_NETWORK_LOST) { Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show(); } mGoogleApiClient.connect(); } @Override public void onLocationChanged(Location location) { Log.i("TAG", "OnLocationChanged"); Log.i("TAG", "Current Location==>" + location); currentlatitude = location.getLatitude(); currentlongitude = location.getLongitude(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { if (connectionResult.hasResolution()) { try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(getActivity(), connectionResult.RESOLUTION_REQUIRED); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } else { Log.e("TAG", "Location services connection failed with code==>" + connectionResult.getErrorCode()); Log.e("TAG", "Location services connection failed Because of==> " + connectionResult.getErrorMessage()); } } @Override public void onDestroy() { super.onDestroy(); if (mGoogleApiClient != null) mGoogleApiClient.disconnect(); } @Override public void onConnected(Bundle bundle) { Location mCurrentLocation; Log.i("TAG", "OnConnected"); if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); // Note that this can be NULL if last location isn't already known. if (mCurrentLocation != null) { // Print current location if not null Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); currentlatitude = mCurrentLocation.getLatitude(); currentlongitude = mCurrentLocation.getLongitude(); } else { startLocationUpdates(); } } } else { mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); // Note that this can be NULL if last location isn't already known. if (mCurrentLocation != null) { // Print current location if not null Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); currentlatitude = mCurrentLocation.getLatitude(); currentlongitude = mCurrentLocation.getLongitude(); } // Begin polling for new location updates. startLocationUpdates(); } }
有关详情,请参阅官方文档https://developers.google.com/android/guides/setup
使用以下代码.希望这很有用.
确保仅将此代码运行到实际设备中.
activity_main.xml中
MainActivity.java
import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; 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.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; 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 mGoogleMap; SupportMapFragment mapFrag; LocationRequest mLocationRequest; GoogleApiClient mGoogleApiClient; Location mLastLocation; Marker mCurrLocationMarker; LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { checkLocationPermission(); } else { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } } mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFrag.getMapAsync(this); } private void showGPSDisabledAlertToUser() { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?") .setCancelable(false) .setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(callGPSSettingIntent); mapFrag.getMapAsync(MainActivity.this); } }); alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = alertDialogBuilder.create(); alert.show(); } @Override public void onPause() { super.onPause(); //stop location updates when Activity is no longer active if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap=googleMap; mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); //Initialize Google Play Services if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } } else { buildGoogleApiClient(); mGoogleMap.setMyLocationEnabled(true); } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } @Override public void onConnected(Bundle bundle) { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(1000); mLocationRequest.setFastestInterval(1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } @Override public void onConnectionSuspended(int i) {} @Override public void onConnectionFailed(ConnectionResult connectionResult) {} @Override public void onLocationChanged(Location location) { mLastLocation = location; if (mCurrLocationMarker != null) { mCurrLocationMarker.remove(); } //Place current location marker LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title("Current Position"); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); //move map camera mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(11)); //stop location updates if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } } public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; public boolean checkLocationPermission() { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. //Prompt the user once explanation has been shown ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } return false; } else { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } return true; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { showGPSDisabledAlertToUser(); } if (mGoogleApiClient == null) { buildGoogleApiClient(); } mGoogleMap.setMyLocationEnabled(true); } } else { // permission denied, boo! Disable the // functionality that depends on this permission. Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); } return; } // other 'case' lines to check for other // permissions this app might request } } }
AndroidManifest.xml中
经过一些调试和搜索,我遇到了确切的问题
GoogleAPIclient onConnected()未调用,因此它调用了onConnectionFailed()方法
在那个方法中,我发现它是2的错误代码,这意味着需要播放服务更新
所以我在gradle文件中更改播放服务,与Device Playservice版本相同,因此我获得当前位置
我在这里发布一些代码:
private synchronized void buildGoogleApiClient() { Log.i("TAG", "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); createLocationRequest();} private void createLocationRequest() { Log.i("TAG", "CreateLocationRequest"); mLocationRequest = new LocationRequest(); long UPDATE_INTERVAL = 10 * 1000; mLocationRequest.setInterval(UPDATE_INTERVAL); long FASTEST_INTERVAL = 10000; mLocationRequest.setFastestInterval(FASTEST_INTERVAL); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); builder = new LocationSettingsRequest.Builder() .addLocationRequest(mLocationRequest); //************************** builder.setAlwaysShow(true); //this is the key ingredient //************************** } private void startLocationUpdates() { Log.i("TAG", "StartLocationUpdates"); if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } else { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } } private void stopLocationUpdates() { Log.i("TAG", "StopLocationUpdates"); LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); } @Override public void onConnectionSuspended(int i) { Log.i("TAG", "onConnectionSuspended"); if (i == CAUSE_SERVICE_DISCONNECTED) { Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show(); } else if (i == CAUSE_NETWORK_LOST) { Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show(); } mGoogleApiClient.connect(); } @Override public void onLocationChanged(Location location) { Log.i("TAG", "OnLocationChanged"); Log.i("TAG", "Current Location==>" + location); currentlatitude = location.getLatitude(); currentlongitude = location.getLongitude(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { if (connectionResult.hasResolution()) { try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(getActivity(), connectionResult.RESOLUTION_REQUIRED); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } else { Log.e("TAG", "Location services connection failed with code==>" + connectionResult.getErrorCode()); Log.e("TAG", "Location services connection failed Because of==> " + connectionResult.getErrorMessage()); } } @Override public void onDestroy() { super.onDestroy(); if (mGoogleApiClient != null) mGoogleApiClient.disconnect(); } @Override public void onConnected(Bundle bundle) { Location mCurrentLocation; Log.i("TAG", "OnConnected"); if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); // Note that this can be NULL if last location isn't already known. if (mCurrentLocation != null) { // Print current location if not null Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); currentlatitude = mCurrentLocation.getLatitude(); currentlongitude = mCurrentLocation.getLongitude(); } else { startLocationUpdates(); } } } else { mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); // Note that this can be NULL if last location isn't already known. if (mCurrentLocation != null) { // Print current location if not null Log.d("DEBUG", "current location: " + mCurrentLocation.toString()); currentlatitude = mCurrentLocation.getLatitude(); currentlongitude = mCurrentLocation.getLongitude(); } // Begin polling for new location updates. startLocationUpdates(); } }
有关详情,请参阅官方文档https://developers.google.com/android/guides/setup