Search code examples
javaandroidapiyahoo-financegoogle-finance

Finance API for Android


I am trying to make a new application and I would like to get stock updates, currency exchange updates etc. Can you please suggest some free API for getting these updates? I have already tried :

1) Google Finance API. Reason for not using: Deprecated and to be closed soon which will make my application obsolete.

2) Yahoo Finance API. Reason for not using: There is no proper documentation for it. The reason for that being that yahoo actually don't have a finance API. It appears some have reverse engineered an API that they use to pull Finance data, but they are breaking Yahoo's Terms of Service. I don't want to do that. (Read from http://developer.yahoo.com/forum/General-Discussion-at-YDN/Using-Yahoo-Finance-API-Not-RSS-/1250246255000-0b82f8f0-7f48-3af2-8fe2-e73a138cbfaa)

It would be great if a link to some resource or code is provided. Thanks for the help in advance.


Solution

  • Using yql now.

    query: "http://query.yahooapis.com/v1/public/yql?q=select%20rate%2Cname%20from%20csv%20where%20url%3D'http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes%3Fs%3D" + from + to + "%253DX%26f%3Dl1n'%20and%20columns%3D'rate%2Cname'&format=json&callback=parseExchangeRate"

    code snippet:

    private static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the
         * BufferedReader.readLine() method. We iterate until the BufferedReader
         * return null which means there's no more data to read. Each line will
         * appended to a StringBuilder and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
    
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
    
    /*
     * This is a test function which will connects to a given rest service and
     * prints it's response to Android Log with labels "Praeda".
     */
    public static String[] connect(String url) {
        HttpClient httpclient = new DefaultHttpClient();
        String[] str = new String[5];
    
        // Prepare a request object
        HttpGet httpget = new HttpGet(url);
    
        // Execute the request
        HttpResponse response;
        try {
            response = httpclient.execute(httpget);
            // Examine the response status
            Log.d(TAG, response.getStatusLine().toString());
    
            // Get hold of the response entity
            HttpEntity entity = response.getEntity();
            // If the response does not enclose an entity, there is no need
            // to worry about connection release
    
            if (entity != null) {
    
                // A Simple JSON Response Read
                InputStream instream = entity.getContent();
                String result = convertStreamToString(instream);
                result=result.replace("parseExchangeRate(", "").replace(");", "");
                Log.d(TAG, result);
    
                // A Simple JSONObject Creation
                JSONObject json = new JSONObject(result);
                Log.d(TAG, "<jsonobject>\n" + json.toString()
                        + "\n</jsonobject>");
    
                // A Simple JSONObject Parsing
                // JSONArray nameArray=json.names();
                // Log.i("query",nameArray.toString());
                // JSONObject query=json.getJSONObject("query");
                // Log.i("query",query.toString());
                // JSONArray results=query.getJSONArray("results");
                // Log.i("rslts",results.toString());
                // JSONArray quote=results.getJSONArray("quote");
                // JSONObject quote=results.getJSONObject("quote");
                // Log.i("quote",quote.toString());
                JSONObject query = json.getJSONObject("query");
                Log.d(TAG, query.toString());
                JSONObject results = query.getJSONObject("results");
                Log.d(TAG, results.toString());
                JSONObject quote = results.getJSONObject("row");
                Log.d(TAG, quote.toString());
                for (int i = 0; i < quote.length(); i++) {
    
                    // Log.i("Praedafor","<jsonname"+i+">\n"+nameArray.getString(i)+"\n</jsonname"+i+">\n"
                    // +"<jsonvalue"+i+">\n"+valArray.getString(i)+"\n</jsonvalue"+i+">");
                    // JSONObject quotes = results.getJSONObject(i)
                    // .getJSONObject("quote");
                    // Log,i
                    // Log.i("name",quote.getString("Name"));
                    // Log.i("name","pahunch");
                    // Log.i("name",quote.getString("Symbol"));
    
                    // Log.i("name",quote.getString("DaysLow"));
    
                    // Log.i("name",quote.getString("DaysHigh"));
    
                    // Log.i("name",quote.getString("Open"));
    
                    // Log.i("name",quote.getString("PreviousClose"));
                    String symbol = quote.getString("rate");
                    str[0] = symbol;
                    String dayslow = quote.getString("DaysLow");
                    str[1]=dayslow;
                    // tv1.setText(quote.getString("DaysLow"));
                    str[2]= quote.getString("DaysHigh");
                    str[3]= quote.getString("Open");
                    str[4]= quote.getString("Change");
                }
    
                // A Simple JSONObject Value Pushing
                // json.put("execution-start-time", "sample value");
                Log.d(TAG, "<jsonobject>\n" + json.toString()
                        + "\n</jsonobject>");
                // Log.i("Praeda12",json.get("").toString());
    
                // Closing the input stream will trigger connection release
                instream.close();
            }
    
        } catch (ClientProtocolException e) {
            Log.d(TAG, "ClientProtocolException");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d(TAG, "IOException " + e.getMessage());
            e.printStackTrace();
        } catch (JSONException e) {
            Log.d(TAG, "JSONException " + e.getMessage());
            e.getMessage();
        }
        return str;
    }