Java 沮丧的getLastLocation.getLatitude()将设置文本,但不会赢得';Don’不要发起双人比赛。使用GoogleAPI进行此操作
所以我整天都在做这件事,我快要失去理智了。为了从另一个api(forcast.io)获取天气信息,我正在尝试从google的location api获取坐标。我的代码已经达到了这样的程度:谷歌api正在用正确的坐标完美地设置我的文本视图。。。但是,当我尝试将这些坐标分配给将作为http链接发送到forcast.io的值时。。。lat和long的值为0.0。我不知道交易是什么。在OnConnection()方法中初始化文本后,我尝试将文本作为字符串从TextView中获取,我尝试在OnConnection()方法中将值初始化为双倍值。。。我已经做了我能想到的一切。这是我的密码:Java 沮丧的getLastLocation.getLatitude()将设置文本,但不会赢得';Don’不要发起双人比赛。使用GoogleAPI进行此操作,java,android,api,google-maps,location,Java,Android,Api,Google Maps,Location,所以我整天都在做这件事,我快要失去理智了。为了从另一个api(forcast.io)获取天气信息,我正在尝试从google的location api获取坐标。我的代码已经达到了这样的程度:谷歌api正在用正确的坐标完美地设置我的文本视图。。。但是,当我尝试将这些坐标分配给将作为http链接发送到forcast.io的值时。。。lat和long的值为0.0。我不知道交易是什么。在OnConnection()方法中初始化文本后,我尝试将文本作为字符串从TextView中获取,我尝试在OnConnec
package com.gardnerwebideas.myweather;
import android.content.Context;
import android.location.Location;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
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.LocationServices;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class MainActivity extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = MainActivity.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
private double mLatitude;
private double mLongitude;
private TextView mLatitudeText;
private TextView mLongitudeText;
//----------------------GOOGLE API BUILD----------------------------
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
//--------------------ON CREATE METHOD--------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLatitudeText = (TextView) findViewById(R.id.latitudeText);
mLongitudeText = (TextView) findViewById(R.id.longitudeText);
buildGoogleApiClient();
mGoogleApiClient.connect();
//---------------------CODE FROM ANDROID PROJECT-----------------------
//----------------SETTING UP NETWORK AND WEATHER API-------------------
String APIKey = "71e3dbfb4ebeb4dc3bcfb07097bb3645";
String forecastUrl = "https://api.forecast.io/forecast/"
+ APIKey + "/"
+ mLatitude
+ ","
+ mLongitude;
if (isNetworkAvailable()) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(forecastUrl)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
try {
if (response.isSuccessful()) {
Log.v(TAG, response.body().string());
} else {
alertUserAboutError();
}
} catch (IOException e) {
Log.e(TAG, "Exception caught: ", e);
}
}
});
} else {
Toast.makeText(this, "Network Unavailable", Toast.LENGTH_LONG).show();
}
Log.d(TAG, "Main UI code is running!");
}
//------------------------NETWORK METHODS-------------------------------
private boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
boolean isAvailable = false;
if (networkInfo != null && networkInfo.isConnected()) {
isAvailable = true;
}
return isAvailable;
}
private void alertUserAboutError() {
AlertDialogFragment dialog = new AlertDialogFragment();
dialog.show(getFragmentManager(), "error_dialogue");
}
//------------------------GOOGLE API CODE-------------------------------
@Override
public void onConnected(Bundle bundle) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
mLatitude = mLastLocation.getLatitude();
mLongitude = mLastLocation.getLongitude();
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}
你的两个变量
private double mLatitude;
private double mLongitude;
从不给定任何值,因此它们采用默认值0
这样行吗
String lat = (((TextView) findViewById(R.id.latitudeText)).getText().toString());
mLatitude = Double.parseDouble(lat);
您缺少一个关键点:地理位置信息是以异步方式处理的。在您的代码中,这意味着您的地理位置信息将在调用forecast.io后可用,这就是为什么您总是看到0值的原因 只需按以下方式更新代码(查看方法
callForecastAPI
):
何时调用OnConnected?你什么时候发送请求?我可以先告诉你你要。。。然后调用onConnected…我应该什么时候使用.connect()方法?我想将变量值设置为onConnected()方法中返回的值。很明显,在获得位置后应该调用weather api吗?我想我正在这么做。我在任何天气api之前调用.connect()(并在onConnected()中设置要在天气api中使用的变量)。Selvin的意思是,您在Google api客户端(调用onConnected)之前对forcast.io进行网络调用,因为网络调用是在onCreate中进行的。尝试在onConnected中移动网络代码(在说mLastLocation!=null的if语句中,作为一个测试,以查看它是否有效。我指的是标有//--------------的代码来自ANDROID项目--------------------//-----------设置网络和天气API-----------------我遵循ANDROID开发站点上的文档…他们给了我代码to在onConnected()方法中分配TextView。我想我应该在那里分配变量的值。现在,我看到在onConnected()中设置的值方法不要继续应用程序的其他部分。那么我该如何分配坐标值?@Wilson抱歉,我不是安卓专家。等待答案。如果你没有得到答案,我会悬赏你的问题,以证明我的诚实。没问题!我感谢你的热心帮助!我尝试了你的建议,但不幸的是仍然没有想要友好!
import android.content.Context;
import android.location.Location;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.example.ziby.testing.R;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class MainActivity extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = MainActivity.class.getSimpleName();
private GoogleApiClient mGoogleApiClient;
private Location mLastLocation;
private double mLatitude;
private double mLongitude;
private TextView mLatitudeText;
private TextView mLongitudeText;
//----------------------GOOGLE API BUILD----------------------------
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
//--------------------ON CREATE METHOD--------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLatitudeText = (TextView) findViewById(R.id.latitudeText);
mLongitudeText = (TextView) findViewById(R.id.longitudeText);
buildGoogleApiClient();
mGoogleApiClient.connect();
Log.d(TAG, "Main UI code is running!");
}
private void callForecastAPI(){
String APIKey = "71e3dbfb4ebeb4dc3bcfb07097bb3645";
String forecastUrl = "https://api.forecast.io/forecast/"
+ APIKey + "/"
+ mLatitude
+ ","
+ mLongitude;
if (isNetworkAvailable()) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(forecastUrl)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
try {
if (response.isSuccessful()) {
Log.v(TAG, response.body().string());
} else {
alertUserAboutError();
}
} catch (IOException e) {
Log.e(TAG, "Exception caught: ", e);
}
}
});
} else {
Toast.makeText(this, "Network Unavailable", Toast.LENGTH_LONG).show();
}
}
//------------------------NETWORK METHODS-------------------------------
private boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
boolean isAvailable = false;
if (networkInfo != null && networkInfo.isConnected()) {
isAvailable = true;
}
return isAvailable;
}
private void alertUserAboutError() {
AlertDialogFragment dialog = new AlertDialogFragment();
dialog.show(getFragmentManager(), "error_dialogue");
}
//------------------------GOOGLE API CODE-------------------------------
@Override
public void onConnected(Bundle bundle) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
mLatitude = mLastLocation.getLatitude();
mLongitude = mLastLocation.getLongitude();
callForecastAPI(); //call the forecast API when you get the location
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}