- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我整天都在为此工作,我快要失去理智了。我正在尝试从谷歌的位置 api 获取坐标,以便从另一个 api (forcast.io) 获取天气。我的代码已经达到这样的程度,即 google api 正在使用正确的坐标完美地设置我的 TextViews ...但是当我尝试将这些坐标分配给将被获取并作为 http 链接发送到 forcast.io 的值时... lat 和 long 的值为 0.0。我不知道这笔交易是什么。在 onConnected() 方法中初始化它们后,我尝试从我的 TextViews 中获取文本作为字符串,我尝试在 onConnected() 方法中将值初始化为 double ...我已经完成了我所做的一切可以想到。这是我的代码:
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) {
}
}
最佳答案
您遗漏了一个关键点:地理位置信息以异步方式处理。在您的代码中,这意味着有关您的地理位置的信息将在您调用 forecast.io 之后 可用,这就是为什么您总是看到 0 值的原因。
只需按照以下方式更新您的代码(查看方法 callForecastAPI
):
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) {
}
}
关于java - 沮丧.. lastLocation.getLatitude() 将设置文本但不会启动双重。为此使用 google api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224569/
Android 的 location.getLatitude() 方法是否提供大地纬度或地心纬度? 如果是大地测量,它是基于 WGS84 还是 GR80 椭球体? API 规范令人惊讶地缺乏,它只声明
我是编程新手,正在学习 Google Location API 教程。我已正确执行所有步骤,但是,以下代码在 getlatitude() 和 getlongitude() 处给我错误。错误:无法解析方
我正在编写跟踪 map 。在我想要分配的 getDeviceLocation 方法中: prevLat=mLastKnownLocation.getLatitude(); prevLng=mLastK
我收到以下运行时错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“double android.location.Location.getLatitu
我正在开发一个应用程序,只要您单击获取位置 (gpsBtn),GPS 就会启用,用户的位置将显示在 TextView 中。我收到 java.lang.NullPointerException 错误,应
我正在处理的 Android 应用程序有问题。该应用程序工作正常,直到我添加了两行代码来获取用户的纬度和经度。当我添加此代码时,我的应用程序无缘无故崩溃。这是带有 getLatitude 和 getL
这个问题在这里已经有了答案: Android getlastknownlocation returns null (1 个回答) 关闭 9 年前。 我在这一行收到一个空指针异常: double la
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 4 年前。 请您解释一下为什么 getLon
这个问题在这里已经有了答案: What is a NullPointerException, and how do I fix it? (12 个答案) 关闭 8 年前。 我正在尝试获取当前的纬度和
我真的遇到了这个错误,已经尝试了我能想到的一切来避免 getLatitude 方法上的 NPE... 有人可以检查我的代码并推荐解决方案吗? 只有当我在纬度和经度的某些坐标中进行硬编码时,它才有效,但
我有一种方法可以在 map 上显示设备的当前位置。我使用 FusedLocationProviderClient 因为它似乎是最准确的。 在 currentLocation.getLatitude()
如何将 getLongitude() 和 getLatitude() 的值转换为 EditText 可以接受的格式? 如果我像这样把它们放到 Toast 中就可以了 String message =
状态:大约一周后接受最佳可用答案并表示感谢。等待/邀请更多答案并引用 这件事很复杂。我真的很感谢所有评论员,特别是 asciimo、Gabe Sechan、AlexWien。请在适当研究后进一步投票和
为什么我不知道,我犯了这个错误。程序之前运行过。但现在我犯了这个错误。谢谢你的帮助... MenuActivity.java: final Context context = this; privat
所以我整天都在为此工作,我快要失去理智了。我正在尝试从谷歌的位置 api 获取坐标,以便从另一个 api (forcast.io) 获取天气。我的代码已经达到这样的程度,即 google api 正在
我一直在寻找答案,但也许我只是没有使用正确的术语。我正在创建一个应用程序,它将访问数据库以返回距用户位置一定距离内的其他用户的列表。我从未使用过此类数据,而且我真的不知道这些值的含义。我想使用 MyS
我正在尝试使用 openstreetmap osmosis 读取机场的 pbf 文件并提取登机口和跑道等特征。 我使用的代码类似于:http://www.javaoptimum.com/how-to-
我想要做的就是让用户获得他喜欢的类型的位置列表。例如,如果输入是医院,我的应用程序将使用搜索字符串“医院”打开谷歌地图。但正如文档中所建议的那样,使用像 geo:0,0?q=hospital 这样的地
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 5 年前。 我正在 android 中创建一
当我使用 Mapbox 时,我遇到了与 GPS 相关的问题。 public class MainActivity extends AppCompatActivity implements OnMapR
我是一名优秀的程序员,十分优秀!