gpt4 book ai didi

java - Android 应用程序未收到位置信息

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:21 24 4
gpt4 key购买 nike

我有一个应用程序需要用户的位置信息,而且我是实现 Google 位置服务的新手。我制作了一个单独的 java 类来处理与获取位置相关的事情,然后在 Activity 中使用位置信息只是为了显示位置(到目前为止),但我在我的 Activity 中得到的纬度和经度默认值为 0。

这是实现位置相关内容的 java 类,遵循谷歌指南:

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");
}

这是这个位置类的调用者( fragment PostCommentFragment)

public class PostCommentFragment extends Fragment {



private TextView mLatitudeText;
private TextView mLongtitudeText;
private CommentDatabase database;
private CommentLocation location;



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
database = new CommentDatabase(getActivity());
location = new CommentLocation(getActivity());
setHasOptionsMenu(true);
}




@TargetApi(11) //for setDisplayHomeAsUpEnabled function
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_post_comment, container, false);

//to enable the app icon to work as a button and get the caret to appear in fragment's view
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
if(NavUtils.getParentActivityName(getActivity()) != null) {
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
}


mLatitudeText = (TextView) v.findViewById(R.id.latitude_text);
mLongtitudeText = (TextView) v.findViewById(R.id.longitude_text);

mLatitudeText.setText(String.valueOf(location.getCommentLatitude()));
mLongtitudeText.setText(String.valueOf(location.getCommentLongitude()));


return v;
}

我在这里做错了什么?我还添加了这一行 compile 'com.google.android.gms:play-services:7.8.0'到 build.gradle(Module:app)->under dependencies,并在 Manifest 中请求许可。谢谢!

最佳答案

问题 1:

您没有在 mGoogleApiClient 上调用 connect()

您需要调用 connect 才能调用 onConnected():

public CommentLocation(Context context){
buildGoogleApiClient(context);
mGoogleApiClient.connect(); //added
}

问题 2:

看起来您只使用了 getLastLocation()。这可能会满足您的需要,但如果您需要一个位置,则不能保证此方法会提供一个位置。 getLastLocation() 方法可以并且将会返回 null。主要问题是它不会提示操作系统请求新的位置锁定,而只是检查是否有来自其他应用程序位置请求的最后一个已知位置。如果最近没有其他应用发出位置请求,则会向您返回一个空位置。

保证您实际获得位置的唯一方法是请求一个位置,这是通过调用 requestLocationUpdates() 完成的。

问题 3:

鉴于连接到 Google Api 客户端需要时间,计时可能会不对,即使您从 getLastLocation() 获得位置,您也可能已经从您的 Fragment 中请求了它.

要解决此问题,您可以使用 BroadcastReceiver 将位置从 CommentLocation 类发送到 Fragment。

请注意,通常将位置功能封装起来是一种更好的方法,但实现起来需要更多的工作。您可能希望采用更简单的设计,其中定位功能位于与此 fragment 相关联的 Activity 中。然后,您可以在位置可用时调用 Fragment。

带有位置监听器的示例 Activity 代码:

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();
}
}

关于java - Android 应用程序未收到位置信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com