我使用 http://api.openweathermap.org/data/2.5/weather 来显示当我使用位置设置在其中发送位置时它在模拟器中工作的天气,但它不在真实设备上工作。 它甚至不会在日志中显示任何错误消息 可以任何人告诉我我做错了什么?
我还在Androidmanifest.xml
添加了所有权限。
MainActivity.java
public class MainActivity extends AppCompatActivity implements LocationListener {
TextView txtCity, txtLastUpdate, txtDescription, txtHumidity, txtTime, txtCelsius;
ImageView imageView;
LocationManager locationManager;
String provider;
static double lat, lng;
OpenWeatherMap openWeatherMap = new OpenWeatherMap();
int MY_PERMISSION = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Control
txtCity = (TextView) findViewById(R.id.txtCity);
txtLastUpdate = (TextView) findViewById(R.id.txtLastUpdate);
txtDescription = (TextView) findViewById(R.id.txtDescription);
txtHumidity = (TextView) findViewById(R.id.txtHumidity);
txtTime = (TextView) findViewById(R.id.txtTime);
txtCelsius = (TextView) findViewById(R.id.txtCelsius);
imageView = (ImageView) findViewById(R.id.imageView);
//Get Coordinates
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
provider = locationManager.getBestProvider(new Criteria(), false);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, MY_PERMISSION);
}
Location location = locationManager.getLastKnownLocation(provider);
if (location == null)
Log.e("TAG","No Location");
}
@Override
protected void onPause() {
super.onPause();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, MY_PERMISSION);
}
locationManager.removeUpdates(this);
}
@Override
protected void onResume() {
super.onResume();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.SYSTEM_ALERT_WINDOW,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, MY_PERMISSION);
}
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
@Override
public void onLocationChanged(Location location) {
lat = location.getLatitude();
lng = location.getLongitude();
new GetWeather().execute(Common.apiRequest(String.valueOf(lat),String.valueOf(lng)));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
private class GetWeather extends AsyncTask<String,Void,String>{
ProgressDialog pd = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.setTitle("Please wait...");
pd.show();
}
@Override
protected String doInBackground(String... params) {
String stream = null;
String urlString = params[0];
Helper http = new Helper();
stream = http.getHTTPData(urlString);
return stream;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if(s.contains("Error: Not found city")){
pd.dismiss();
return;
}
Gson gson = new Gson();
Type mType = new TypeToken<OpenWeatherMap>(){}.getType();
openWeatherMap = gson.fromJson(s,mType);
pd.dismiss();
txtCity.setText(String.format("%s,%s",openWeatherMap.getName(),openWeatherMap.getSys().getCountry()));
txtLastUpdate.setText(String.format("Last Updated: %s", Common.getDateNow()));
txtDescription.setText(String.format("%s",openWeatherMap.getWeather().get(0).getDescription()));
txtHumidity.setText(String.format("%d%%",openWeatherMap.getMain().getHumidity()));
txtTime.setText(String.format("%s/%s",Common.unixTimeStampToDateTime(openWeatherMap.getSys().getSunrise()),Common.unixTimeStampToDateTime(openWeatherMap.getSys().getSunset())));
txtCelsius.setText(String.format("%.2f °C",openWeatherMap.getMain().getTemp()));
Picasso.with(MainActivity.this)
.load(Common.getImage(openWeatherMap.getWeather().get(0).getIcon()))
.into(imageView);
}
}
}
Common.java
public class Common {
public static String API_KEY = "mykey";
public static String API_LINK = "http://api.openweathermap.org/data/2.5/weather";
@NonNull
public static String apiRequest(String lat, String lng){
StringBuilder sb = new StringBuilder(API_LINK);
sb.append(String.format("?lat=%s&lon=%s&APPID=%s&units=metric",lat,lng,API_KEY));
return sb.toString();
}
public static String unixTimeStampToDateTime(double unixTimeStamp){
DateFormat dateFormat = new SimpleDateFormat("HH:mm");
Date date = new Date();
date.setTime((long)unixTimeStamp*1000);
return dateFormat.format(date);
}
public static String getImage(String icon){
return String.format("http://openweathermap.org/img/w/%s.png",icon);
}
public static String getDateNow(){
DateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy HH:mm");
Date date = new Date();
return dateFormat.format(date);
}
}
答案 0 :(得分:0)
方法getLastKnownLocation
在上次获取位置信息时,它可能为空。
您可以参考关键字的其他问题:getLastKnownLocation return null
这些问题对你有帮助,可能是。
getlastknownlocation always return null after I re-install the apk file via eclipse