Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 沮丧的getLastLocation.getLatitude()将设置文本,但不会赢得';Don’不要发起双人比赛。使用GoogleAPI进行此操作_Java_Android_Api_Google Maps_Location - Fatal编程技术网

Java 沮丧的getLastLocation.getLatitude()将设置文本,但不会赢得';Don’不要发起双人比赛。使用GoogleAPI进行此操作

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

所以我整天都在做这件事,我快要失去理智了。为了从另一个api(forcast.io)获取天气信息,我正在尝试从google的location api获取坐标。我的代码已经达到了这样的程度:谷歌api正在用正确的坐标完美地设置我的文本视图。。。但是,当我尝试将这些坐标分配给将作为http链接发送到forcast.io的值时。。。lat和long的值为0.0。我不知道交易是什么。在OnConnection()方法中初始化文本后,我尝试将文本作为字符串从TextView中获取,我尝试在OnConnection()方法中将值初始化为双倍值。。。我已经做了我能想到的一切。这是我的密码:

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) {

    }
}