Java Android应用程序上未接收到位置
我有一个应用程序需要用户的位置,我是谷歌位置服务的新手。 我创建了一个单独的java类来处理与获取位置相关的事情,然后在活动中使用位置信息来显示位置(到目前为止),但在活动中,纬度和经度的默认值为0 下面是实现位置相关内容的java类,遵循google指南:Java Android应用程序上未接收到位置,java,android,location,google-api-client,Java,Android,Location,Google Api Client,我有一个应用程序需要用户的位置,我是谷歌位置服务的新手。 我创建了一个单独的java类来处理与获取位置相关的事情,然后在活动中使用位置信息来显示位置(到目前为止),但在活动中,纬度和经度的默认值为0 下面是实现位置相关内容的java类,遵循google指南: import android.content.Context; import android.location.Location; import android.os.Bundle; import android.util.Log; imp
import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
public class CommentLocation implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private double mLatitude;
private double mLongitude;
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
public CommentLocation(Context context){
buildGoogleApiClient(context);
}
public double getCommentLongitude() {
return mLongitude;
}
public double getCommentLatitude() {
return mLatitude;
}
protected synchronized void buildGoogleApiClient(Context context) {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle connectionHint) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
mLatitude = mLastLocation.getLatitude();
mLongitude = mLastLocation.getLongitude();
}
else{
Log.v(CommentLocation.class.getName(), "LOCATION WAS NOT RECEIVED");
}
Log.v(CommentLocation.class.getName(), "CONNECTION TO GET LOCATION IS SUCCESSFUL");
}
@Override
public void onConnectionSuspended(int i) {
//TODO
Log.v(CommentLocation.class.getName(), "CONNECTION TO GET LOCATION IS SUSPENDED");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
//TODO
Log.v(CommentLocation.class.getName(), "CONNECTION TO GET LOCATION IS FAILED");
}
}
这是这个location类(fragment PostCommentFragment)的调用者
我做错了什么?
我还添加了这一行:“com.google.android.gms:play services:7.8.0”
在依赖项下build.gradle(模块:app)->,并在清单中请求权限。谢谢 第1期: 您没有在mGoogleApiClient上调用
connect()
您需要调用connect才能调用onConnected()
:
public CommentLocation(Context context){
buildGoogleApiClient(context);
mGoogleApiClient.connect(); //added
}
第二期:
看起来您只使用了getLastLocation()
。这可能适合您的需要,但如果您需要一个位置,此方法不能保证提供一个位置。getLastLocation()
方法可以并且将返回null。主要问题是,它不会提示操作系统请求新的位置锁,而只是检查是否存在来自其他应用程序位置请求的最后一个已知位置。如果最近没有其他应用程序发出位置请求,则返回给您的位置为空
确保您实际获得位置的唯一方法是请求一个位置,这是通过调用requestLocationUpdates()完成的
第三期:
考虑到连接到Google Api客户端需要时间,计时可能会中断,即使您从getLastLocation()
获得位置,您也可能已经从片段中请求了它
为了解决这个问题,可以使用BroadcastReceiver将位置从CommentLocation类发送到片段
请注意,一般来说,封装位置功能是一种更好的方法,但需要做更多的工作来实现。您可能希望采用更简单的设计,其中位置功能位于与此片段关联的活动中。然后,您可以在位置可用时调用片段
带有位置侦听器的示例活动代码:
public class MainActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buildGoogleApiClient();
mGoogleApiClient.connect();
}
@Override
protected void onPause(){
super.onPause();
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, 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 onConnected(Bundle bundle) {
Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
//mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
//mLocationRequest.setSmallestDisplacement(0.1F);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show();
}
@Override
public void onLocationChanged(Location location) {
Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude());
Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show();
}
}
你在模拟器中启用了模拟位置了吗?我使用的是real device、nexus 7和sony xperiaIssue 1和2:我添加了connect()函数,我使用了另一个使用location获取最后一个位置的应用程序,但返回的值仍然是0!。。。问题3:“考虑到连接到Google Api客户端需要时间,计时可能会中断,即使您从getLastLocation()获得了位置,您也可能已经从片段中请求了它。”您能详细介绍一下吗?我不明白问题是什么。我想要一个单独的类来处理位置的原因是我将在另外两个活动中使用它,所以。。。谢谢much@ashl当然,将一些日志放在onConnected()方法中,并将日志放在getComment经度()和getCommentLatitude()方法中。我猜在onConnected()有机会检查位置之前调用了这些函数。日志将告诉您他们被呼叫的顺序,以及这是否是问题所在。
public class MainActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buildGoogleApiClient();
mGoogleApiClient.connect();
}
@Override
protected void onPause(){
super.onPause();
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, 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 onConnected(Bundle bundle) {
Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
//mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
//mLocationRequest.setSmallestDisplacement(0.1F);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show();
}
@Override
public void onLocationChanged(Location location) {
Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude());
Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show();
}
}