私のアプリケーションでは、さまざまな通貨の現在の為替レートを取得する必要があります。this、this、およびthis question で提案されているように、それを行うための良い方法は、Yahoo Finance サービスを使用することです。
たとえば、米ドルとカナダ ドルのレートを知りたい場合は、次のリンクを送信するだけです。http://download.finance.yahoo.com/d/quotes.csv?s=USDCAD=X&f=sl1d1t1ba&e=.csv
これは、Android 2.3.4 を搭載した Motorola Atrix フォンと、Google API 2.3.3 を搭載したエミュレーターの両方で正常に動作しています。ただし、Android ICS 4.0 を使用する Galaxy SII と Google API 4.0 を使用するエミュレーターからまったく同じリンクを試すと、どちらの場合も quotes.csv ファイルには「Missing Symbols List」のみが含まれます。
調べてみると、料金が見つからない場合にこの応答が発生する可能性があることがわかりました。ただし、この応答は、Android 4.0 (Galaxy SII またはエミュレーター) で試したすべての通貨に対するものです。したがって、Android 4.0 ではレートを取得できませんが、Android 2.x では取得できます。
同じ問題を経験した人はいますか?回避策はありますか?
編集: これは、Yahoo 通貨サービスからのレートのダウンロードを処理するスレッド コードです。
//show the progress dialog
downloadingDialog.show();
Runnable getRates = new Runnable() {
public void run(){
dataNotFound = false;
final String baseDir = getApplicationContext().getFilesDir().getAbsolutePath();
//download the rates from yahoo to a CSV file
downloadFileViaHTTP (baseDir);
//read the file line
String filePath = baseDir + "/" + "quotes.csv";
Log.d(tag, "-> filePath = " + filePath);
try {
// open the file for reading
InputStream instream = new FileInputStream(filePath);
// if file the available for reading
if (instream != null) {
// prepare the file for reading
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
//read the line
String fileLine = buffreader.readLine();
Log.d(tag, "fileLine = " + fileLine);
instream.close();
}
}
catch (Exception ex) {
// print stack trace.
}
}
};
final Thread t = new Thread(getRates);
t.start();
これは、Yahoo サイトから quotes.csv ファイルをダウンロードするための関数です。
public void downloadFileViaHTTP (String localPath) {
Log.d(tag, "downloadFileViaHTTP...");
try {
//this is the Yahoo url
String urlFile = "http://download.finance.yahoo.com/d/quotes.csv?s=" + fromCurrency + toCurrency + "=X&f=sl1d1t1ba&e=.csv";
Log.d(tag,"urlFile = " + urlFile);
URL url = new URL(urlFile);
//create the new connection
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
//pointer to the downloaded file path
String localFileName = localPath + "/" + "quotes.csv";
//this is the actual downloaded file
File MyFilePtrDest = new File(localFileName);
Log.d(tag,"localFileName = " + localFileName);
//this will be used in reading the data from the Internet
InputStream inputStream = urlConnection.getInputStream();
//this will be used to write the downloaded data into the file we created
FileOutputStream fileOutput = new FileOutputStream(MyFilePtrDest);
byte[] buffer = new byte[1024];
int bufferLength = 0; //used to store a temporary size of the buffer
//write buffer contents to file
while ((bufferLength = inputStream.read(buffer)) > 0 ) {
//add the data in the buffer to the file in the file output stream (the file on the sd card
fileOutput.write(buffer, 0, bufferLength);
}
inputStream.close();
//close the output stream when done
fileOutput.flush();
fileOutput.close();
urlConnection.disconnect();
}
catch (IOException e) {
//data were not found
dataNotFound = true;
// TODO Auto-generated catch block
e.printStackTrace();
}
}
これは、Google API 2.3.3 エミュレーターからのログです。
12-18 11:04:24.091: D/CurrencyConverter(414): downloadFileViaHTTP...
12-18 11:04:24.091: D/CurrencyConverter(414): urlFile = http://download.finance.yahoo.com/d/quotes.csv?s=EURUSD=X&f=sl1d1t1ba&e=.csv
12-18 11:04:24.282: D/CurrencyConverter(414): localFileName = /data/data/com.myapps.currencyconverter/files/quotes.csv
12-18 11:04:24.461: D/CurrencyConverter(414): -> filePath = /data/data/com.myapps.currencyconverter/files/quotes.csv
12-18 11:04:24.461: D/CurrencyConverter(414): fileLine = "EURUSD=X",1.3172,"12/18/2012","4:03am",1.317,1.3174
これは、Google API 4.0 エミュレーターのログです。
12-18 11:47:36.130: D/CurrencyConverter(668): downloadFileViaHTTP...
12-18 11:47:36.130: D/CurrencyConverter(668): urlFile = http://download.finance.yahoo.com/d/quotes.csv?s=EURUSD=X&f=sl1d1t1ba&e=.csv
12-18 11:47:36.449: D/dalvikvm(668): GC_CONCURRENT freed 306K, 4% free 11714K/12167K, paused 5ms+10ms
12-18 11:47:36.951: D/CurrencyConverter(668): localFileName = /data/data/com.myapps.currencyconverter/files/quotes.csv
12-18 11:47:37.159: D/CurrencyConverter(668): -> filePath = /data/data/com.myapps.currencyconverter/files/quotes.csv
12-18 11:47:37.159: D/CurrencyConverter(668): fileLine = Missing Symbols List.
「fileLine」文字列変数を見るとわかるように、最初のケースでは適切なレートが取得されますが、2 番目のケースでは quotes.csv ファイルに「Missing Symbols List」が含まれているだけです。価値。
EDIT2: Android プロジェクト全体を共有フォルダーにアップロードしたので、誰もが試すことができます。Android 2.x と 4 の両方のエミュレーター (または、お持ちの場合は電話 :-)) でコンパイルして実行できます。
EDIT3:これは直接的な答えではありませんが、それでも回避策です。Yahoo の代わりに Google の通貨計算機を使用しています。Google 通貨計算機を使用するには、Yahoo の URL をhttp://www.google.com/ig/calculator?hl=en&q=1 " + fromCurrency + "=?" + toCurrency に変更するだけです。このリンクをクリックして、 78 ユーロを USD に変換する例を参照してください. 私は確認したところ、両方の Android バージョンで動作します. しかし、誰かが Yahoo サイトでこれが起こっている理由を見つけたら、それを私たちと共有することをお勧めします..