繁体   English   中英

在Android中使用日出/日落REST API。 如何正确传递获取位置坐标的URL?

[英]Using sunrise/sunset REST API in Android. How to correctly pass the URL with obtained location coordinates?

我正在创建一个Android应用程序,它获取用户位置的坐标,然后使用这些坐标与由此网站提供的REST API进行通信

我是JSON解析和REST API的新手。 我按照本教程使用了AsyncTask,Spring和Jackson

我的MainActivity.java看起来像这样 -

package com.gamecodeschool.whereintheworld;

import android.content.Context;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.location.Criteria;
import android.location.Location;

import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import android.os.AsyncTask;

public class MainActivity extends AppCompatActivity implements LocationListener {

    private TextView txtLat;
    private TextView txtLong;
    private TextView txtSource;
    private LocationManager locationManager;
    private String provider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        new HttpRequestTask().execute();
        setContentView(R.layout.activity_main);
        txtLat = (TextView) findViewById(R.id.txtLat);
        txtLong = (TextView) findViewById(R.id.txtLong);
        txtSource = (TextView) findViewById(R.id.txtSource);

        //Initialize locationManager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);

        //initialize the location
        if(location != null){
            txtSource.setText("Source = " +provider);
            onLocationChanged(location);
        }

    }
    //start updates when app starts/resumes
    @Override
    protected void onResume() {
        super.onResume();
        new HttpRequestTask().execute();
        locationManager.requestLocationUpdates
                (provider, 500, 1, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        txtLat.setText(String.valueOf(lat));
        txtLong.setText(String.valueOf(lng));
        txtSource.setText("Source = " + provider);
    }

    public String getCoordinates(Location location)
    {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();

        return ("lat="+latitude+"&lng="+longitude);

    }

    @Override
    public void onStatusChanged(String provider,
                                int status, Bundle extras) {
        txtSource.setText("Source = " + provider);
    }
    @Override
    public void onProviderEnabled(String provider) {

        txtSource.setText("Source = " + provider);
    }
    @Override
    public void onProviderDisabled(String provider) {

        txtSource.setText("Source = " + provider);
    }

    //USER DEFINED CLASS
    private class HttpRequestTask extends AsyncTask<Void, Void, sunrisedata> {



        @Override
        protected sunrisedata doInBackground(Void... params) {
            try {


                final String url = "http://api.sunrise-sunset.org/json?";
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
                sunrisedata greeting = restTemplate.getForObject(url, sunrisedata.class);
                return greeting;
            } catch (Exception e) {
                Log.e("MainActivity", e.getMessage(), e);
            }

            return null;
        }

        @Override
        protected void onPostExecute(sunrisedata greeting) {
            TextView greetingIdText = (TextView) findViewById(R.id.txtSunrise);

            greetingIdText.setText(greeting.getSunrise());

        }

    }


}

这里是MainActivity.java的这一部分

final String url = "http://api.sunrise-sunset.org/json?";

我想传递从这部分代码中获得的坐标 -

public void onLocationChanged(Location location) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        txtLat.setText(String.valueOf(lat));
        txtLong.setText(String.valueOf(lng));
        txtSource.setText("Source = " + provider);
    }

因为根据REST API文档,GET请求URL应采用以下格式 -

http://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400

我可以通过什么方式检索纬度和经度并将其附加到HttpRequestTask类的方法中的URL中 -

protected sunrisedata doInBackground(Void... params) 

截至目前,logcat错误看起来像这样 -

04-03 01:56:35.231 13842-1925/com.gamecodeschool.whereintheworld E/MainActivity: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                     at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
                                                                                 org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                     at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
                                                                                     at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:126)
                                                                                     at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147)
                                                                                     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76)
                                                                                     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484)
                                                                                     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
                                                                                     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
                                                                                     at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:111)
                                                                                     at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:99)
                                                                                     at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                     at java.lang.Thread.run(Thread.java:818)
                                                                                  Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
                                                                                     at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524)
                                                                                     at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3094)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2339)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:817)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:697)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3031)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2978)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
                                                                                     at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:123)
                                                                                        ... 13 more
04-03 01:56:35.232 13842-13842/com.gamecodeschool.whereintheworld D/AndroidRuntime: Shutting down VM
04-03 01:56:35.233 13842-13842/com.gamecodeschool.whereintheworld E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.gamecodeschool.whereintheworld, PID: 13842
                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.gamecodeschool.whereintheworld.sunrisedata.getSunrise()' on a null object reference
                                                                                        at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.onPostExecute(MainActivity.java:124)
                                                                                        at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.onPostExecute(MainActivity.java:99)
                                                                                        at android.os.AsyncTask.finish(AsyncTask.java:636)
                                                                                        at android.os.AsyncTask.access$500(AsyncTask.java:177)
                                                                                        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                        at android.os.Looper.loop(Looper.java:135)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5294)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
04-03 01:56:36.027 13842-2035/com.gamecodeschool.whereintheworld E/MainActivity: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                     at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
                                                                                 org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                     at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
                                                                                     at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:126)
                                                                                     at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147)
                                                                                     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76)
                                                                                     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484)
                                                                                     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
                                                                                     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
                                                                                     at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:111)
                                                                                     at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:99)
                                                                                     at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                     at java.lang.Thread.run(Thread.java:818)
                                                                                  Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
                                                                                  at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
                                                                                     at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524)
                                                                                     at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3094)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2339)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:817)
                                                                                     at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:697)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3031)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2978)
                                                                                     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
                                                                                     at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:123)
                                                                                        ... 13 more

据我所知,这个错误即将发生,因为正确的URL以及纬度和经度未被传递到网站。 显然,应用程序在手机上运行时也会崩溃。

我在spring网站上按照教程创建的另一个类是 - sunrisedata.java,用于存储获得的JSON响应,如下所示:

package com.gamecodeschool.whereintheworld;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;


@JsonIgnoreProperties(ignoreUnknown=true)
public class sunrisedata {

    private String results;

    public String getSunrise(){

        return this.results;
    }

}

请告诉我如何正确地将MainActivity类中获得的lat和long值传递给HttpRequestTask类中的url,我只想从JSON中检索日出数据并忽略所有其他字段。

获取用户的位置是异步发生的,这意味着您必须等到位置从LocationManager返回给您,然后才能获得获取日出/日落数据的请求。

现在,您正在请求onResume()的日出/子集数据,这是不正确的。 当您在此处执行请求时,您可能还没有位置数据。

看起来你想在onLocationChanged()获取日出/日落数据。 此方法将包含您需要添加到网址的位置信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM