从网站获取数据到Google Glass

时间:2014-04-04 13:10:07

标签: java json parsing google-glass

我还在学习如何从网站上提取数据,我真的希望我能得到一些适合初学者的好答案。无论如何,我的目标是在我的应用程序的背景中提取数据(不打开并在我的应用程序中显示它)。这个想法是存储数据以供以后使用。 我正在使用的API有2个GetMethods: GetProductJSON(具有JSON响应)和GetProduct(具有逗号分隔值(CSV)响应) 以下是JSON Response网站的示例:

     {"0":{"productname":"Neutrogena Lips Stick 4.8g","imageurl":"http://ecx.images-  amazon.com/images/I/31E1ct854gL._SL160_.jpg","producturl":"","price":"5.65","currency":"USD","saleprice":"","storename":"N/A"}}

Comma Seperated Values Response看起来像这样:

     "productname","imageurl","producturl","price","currency","saleprice","storename"
     "Neutrogena Lips Stick 4.8g","http://ecx.images-amazon.com/images/I/31E1ct854gL._SL160_.jpg","","5.65","USD","","N/A"

以下是我打电话给网站的方式:

    url = url.replace("{CODE}", codeValue);

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    cardPresenter.setPendingIntent(createPendingIntent(getContext(), intent));

有关如何使其成为后台任务以及如何在java中实际获取数据的任何建议,以便我可以在Livecard上使用它们。

4 个答案:

答案 0 :(得分:2)

首先,您需要访问Internet。在AndroidManifest.xml中包含以下权限:

<uses-permission android:name="android.permission.INTERNET" />

使用GDK和AsyncTask:

import android.os.AsyncTask;

public class RetrieveData extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... resource) {
        String data;
        try {
            URL url = new URL(resource[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream in = new BufferedInputStream(connection.getInputStream());
            data = convertStreamToString(in);
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }

    private String convertStreamToString(InputStream in) {
        Scanner s = new Scanner(in);
        return s.useDelimiter("\\A").hasNext() ? s.next() : "";
    }
}

方法convertStreamToString()描述为there

在您的服务或活动中:

String retrievedData;
try {
    retrievedData = new RetrieveData().execute("http://www.example.com/GetProductJSON").get();
} catch (Exception e) {
    e.printStackTrace();
}
// Process data

希望有所帮助。

答案 1 :(得分:0)

使用GDK至少有这些选择:1)创建异步任务;或2)创建一个定期分配任务的私人服务。

答案 2 :(得分:0)

您在Android应用中需要做的第一件事就是在AndroidManifest.xml文件中添加访问Internet的权限。将此标记添加为<application>

的兄弟
<uses-permission android:name="android.permission.INTERNET"/>

然后,您需要考虑以何种方式发出HTTP请求。在理想的应用程序中,您需要使用AsyncTask类来发出这些请求以避免阻塞UI线程。

如果您只是在寻找快速概念证明,可以通过修改策略在UI线程上允许这些请求。将此代码添加到onCreate()

中的MainActivity方法
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

这不是一个明智的长期解决方案,因为它会阻止UI线程,但它上面有StackOverflow主题。 How to fix android.os.NetworkOnMainThreadException?

这是另一篇关于AsyncTask http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html概念的文章。

答案 3 :(得分:0)

虽然您似乎表示您正在使用GDK,但您可能需要考虑通过Mirror API进行服务器推送。由于您无论如何都需要通过网络获取信息,因此您将失去GDK提供的许多优势。

使用Mirror API,您可以使用timeline.insert创建新的时间轴项目,并保存已创建的卡片的ID。您可能希望为用户提供固定卡的选项,以便将其放置在&#34; now&#34;时间线的区域。

更新时,您可以使用新信息致电timeline.update

请注意,您需要定期更新卡片,否则可能会在七天不活动后从时间线或固定区域掉落。