Android - 获取位置的最简单方法
Android - Easiest way to get location
再见!我有一个 Activity 需要当前位置,以便用户可以看到哪些物体离他很近。
好吧,我将疯狂使用 GoogleApiClient、FusedLocation、回调等等,我得到的唯一结果是 getLastLocation
returns null
.
我的 Activity 实现了 GoogleApiClient.ConnectionCallbacks
和 GoogleApiClient.OnConnectionFailedListener
。
在OnCreate
中我调用getLocation()
是这样的:
private void getLocation(){
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(60*1000);
locationRequest.setFastestInterval(10*1000);
mFusedLocationApi = LocationServices.FusedLocationApi;
gApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (gApiClient != null) {
gApiClient.connect();
}
}
我也有这个:
@Override
protected void onStart() {
super.onStart();
if (gApiClient != null) {
gApiClient.connect();
}
}
@Override
protected void onStop() {
gApiClient.disconnect();
super.onStop();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.w("ADVSEARCH","Error on connection failed");
}
@Override
public void onConnectionSuspended(int i) {
Log.w("ADVSEARCH","Error on connection suspended");
}
@Override
public void onConnected(Bundle bundle) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener() {
@Override
public void onLocationChanged(Location location) {
lastlocation = location;
}
});
}
lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
}
是的,我在 OnCreate
中检查权限。最低 API 16,目标 API 25。
每次我第一次打开应用程序时,它都会崩溃,因为我在空对象上使用 distanceTo
。我错过了什么?越搜越糊涂
我认为这可能是不同的事情,例如您没有在 Manifest 文件中设置所有内容,或者您在运行时没有权限(您需要在应用程序首次启动时允许这样做,或者您在应用程序设置中手动设置)。试试这个...
build.gradle
implementation 'com.google.android.gms:play-services-location:11.6.0'
在你的Activity.java
private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;
private void getLocationRequest() {
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
if (!checkPermission()) {
getLocationPermissions();
return;
}
client.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
// Logic to handle location object
Log.e("TAG", "location = " + location);
} else {
Log.e("TAG", "not successful");
}
}
});
}
private boolean checkPermission() {
return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) &&
isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION));
}
@TargetApi(Build.VERSION_CODES.M)
private void getLocationPermissions() {
requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_REQUEST_FINE_LOCATION);
}
@Override
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results) {
switch (code) {
case PERMISSION_REQUEST_FINE_LOCATION:
if (isPermissionGranted(results)) {
getLocationRequest();
}
}
}
private boolean isPermissionGranted(int[] results) {
return results != null && results.length > 0 && isGranted(results[0]);
}
private boolean isGranted(int permission) {
return permission == PackageManager.PERMISSION_GRANTED;
}
这会询问您是否尚未设置权限,并在对话结果肯定后再次调用 getLocationRequest
。
然后检查你的 AndroidManifest.xml
中是否有这个
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />
当然,您必须满足您的需求(精细或粗糙的位置等)。
希望这能让你走上正轨 ;)
再见!我有一个 Activity 需要当前位置,以便用户可以看到哪些物体离他很近。
好吧,我将疯狂使用 GoogleApiClient、FusedLocation、回调等等,我得到的唯一结果是 getLastLocation
returns null
.
我的 Activity 实现了 GoogleApiClient.ConnectionCallbacks
和 GoogleApiClient.OnConnectionFailedListener
。
在OnCreate
中我调用getLocation()
是这样的:
private void getLocation(){
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(60*1000);
locationRequest.setFastestInterval(10*1000);
mFusedLocationApi = LocationServices.FusedLocationApi;
gApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (gApiClient != null) {
gApiClient.connect();
}
}
我也有这个:
@Override
protected void onStart() {
super.onStart();
if (gApiClient != null) {
gApiClient.connect();
}
}
@Override
protected void onStop() {
gApiClient.disconnect();
super.onStop();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.w("ADVSEARCH","Error on connection failed");
}
@Override
public void onConnectionSuspended(int i) {
Log.w("ADVSEARCH","Error on connection suspended");
}
@Override
public void onConnected(Bundle bundle) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener() {
@Override
public void onLocationChanged(Location location) {
lastlocation = location;
}
});
}
lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
}
是的,我在 OnCreate
中检查权限。最低 API 16,目标 API 25。
每次我第一次打开应用程序时,它都会崩溃,因为我在空对象上使用 distanceTo
。我错过了什么?越搜越糊涂
我认为这可能是不同的事情,例如您没有在 Manifest 文件中设置所有内容,或者您在运行时没有权限(您需要在应用程序首次启动时允许这样做,或者您在应用程序设置中手动设置)。试试这个...
build.gradle
implementation 'com.google.android.gms:play-services-location:11.6.0'
在你的Activity.java
private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;
private void getLocationRequest() {
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
if (!checkPermission()) {
getLocationPermissions();
return;
}
client.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
// Logic to handle location object
Log.e("TAG", "location = " + location);
} else {
Log.e("TAG", "not successful");
}
}
});
}
private boolean checkPermission() {
return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) &&
isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION));
}
@TargetApi(Build.VERSION_CODES.M)
private void getLocationPermissions() {
requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_REQUEST_FINE_LOCATION);
}
@Override
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results) {
switch (code) {
case PERMISSION_REQUEST_FINE_LOCATION:
if (isPermissionGranted(results)) {
getLocationRequest();
}
}
}
private boolean isPermissionGranted(int[] results) {
return results != null && results.length > 0 && isGranted(results[0]);
}
private boolean isGranted(int permission) {
return permission == PackageManager.PERMISSION_GRANTED;
}
这会询问您是否尚未设置权限,并在对话结果肯定后再次调用 getLocationRequest
。
然后检查你的 AndroidManifest.xml
中是否有这个<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />
当然,您必须满足您的需求(精细或粗糙的位置等)。
希望这能让你走上正轨 ;)