Я подумал, что просто оставлю общий ответ о выполнении HTTP-запросов и загрузке файлов, но более неприятная вещь, с которой я столкнулся, это то, как Microsoft Azure хочет выполнить аутентификацию. Очевидно, использование идентификатора приложения устарело, и их API чрезвычайно требователен к заголовкам и параметрам запроса.
В любом случае, я бы предложил начать с написания AsyncTask
, который обрабатывает выполнение HttpURLConnection
. Я закончил с:
/**
* Tailor-made HTTP request for Microsoft Azure, downloading a file to a
* specified location.
*/
private class HttpDownloadFile extends AsyncTask<String, Integer, String> {
private String mDir;
@Override
protected String doInBackground(String... params) {
if (params.length < 2) {
throw new IllegalArgumentException(
"Two arguments required for "
+ getClass().getSimpleName());
}
String response = null;
String uri = params[0];
String query = params[1];
try {
if (query.length() > 0) {
uri += "?" + query;
}
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
if (params.length > 2) {
connection.setRequestProperty("Authorization", "Bearer "
+ params[2]);
}
connection.connect();
int fileLength = connection.getContentLength();
String charset = PREFERRED_CHARSET;
if (connection.getContentEncoding() != null) {
charset = connection.getContentEncoding();
}
InputStream input;
OutputStream output;
boolean isError = false;
try {
input = connection.getInputStream();
output = new FileOutputStream(mDir);
} catch (IOException e) {
input = connection.getErrorStream();
output = new ByteArrayOutputStream();
isError = true;
}
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
output.flush();
if (!isError) {
response = mDir;
} else {
response = ((ByteArrayOutputStream) output).toString(charset);
Log.e(TAG, response);
response = null;
}
output.close();
input.close();
} catch (Exception e) {
Log.e(TAG, "Failed requesting " + uri, e);
}
return response;
}
}
Затем вы можете выполнить задачу с правильными параметрами:
HttpDownloadFile task = new HttpDownloadFile();
task.execute(
getString(R.string.url_speak),
getString(R.string.url_speak_query,
text, toLanguage, file),
accessToken,
Environment.getExternalStorageDirectory().getPath()
+ "/temp.wav");
My strings.xml
содержит:
<string
name="url_speak"
formatted="false"
translate="false">http://api.microsofttranslator.com/v2/Http.svc/Speak</string>
<string
name="url_speak_query"
formatted="false"
translate="false">text=%s&language=%s&file=%s</string>
К сожалению, это означает, что вам необходимо написать код для получения токена аутентификации, который уже сделан. Не волнуйтесь! Я также написал полный код для всего этого:
MainActivity.java
strings.xml