Android 图片下载:使用 AsyncTask 和 OkHttpClient 从 API 获取图片并保存
public void dow_imgone(final View view) {
new AsyncTask<Void, Void, String>() {
protected String doInBackground(Void... voids) {
OkHttpClient client = new OkHttpClient();
EditText editText = findViewById(R.id.edit_text);
String inputText = editText.getText().toString();
if (inputText.isEmpty()) {
Snackbar.make(view, '输入框为空', Snackbar.LENGTH_LONG)
.setAction('Action', null).show();
return '输入框为空';
}
String url = 'https://app.huashijie.art/api/work/detailV2?visitorId=-1&workId=' + inputText + '&cur_user_id=-1&platform=android&os_version=28&version_code=217&device_brand=vivo&device_model=vivo%20X21&token=&channel=vivo';
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(responseBody).getAsJsonObject();
String imageUrl = json.get('data').getAsJsonObject().get('multiImages').getAsJsonArray().get(0).getAsJsonObject().get('imgPath').getAsString();
if (imageUrl != null) {
String fileName = 'image.jpg';
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File outputFile = new File(downloadDir, fileName);
downloadImage(view); // 调用downloadImage方法
return '获取链接成功' + imageUrl + '文件将保存到:' + downloadDir;
} else {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText('imageUrl', imageUrl);
clipboard.setPrimaryClip(clip);
return '未能提取到图片地址' + imageUrl;
}
} catch (IOException e) {
e.printStackTrace();
return '下载失败';
}
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
}.execute();
}
private void downloadImage(final View view) {
Snackbar.make(view, '正在下载图片', Snackbar.LENGTH_LONG)
.setAction('Action', null).show();
}
代码功能:
- 使用
OkHttpClient发起网络请求,获取 API 返回的图片链接。 - 使用
JsonParser解析 API 返回的 JSON 数据,获取图片链接。 - 在获取到图片链接后,调用
downloadImage(view)方法,显示Snackbar提示正在下载图片。 - 使用
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)获取外部存储的下载目录,将图片保存到该目录下。 - 在
onPostExecute方法中,使用Toast显示下载结果。
注意:
- 该代码示例需要在
AndroidManifest.xml文件中添加INTERNET权限。 - 需要在项目中添加
OkHttp和Gson库。 - 需要在代码中添加获取
Context和View的逻辑。
其他优化建议:
- 可以考虑使用
Glide或Picasso等图片加载库来加载和显示图片。 - 可以考虑在
downloadImage方法中使用Thread或Handler来异步执行图片下载操作,避免阻塞 UI 线程。 - 可以考虑添加进度条,显示图片下载进度。
- 可以考虑添加错误处理机制,处理网络请求失败等异常情况。
总结:
该代码示例展示了如何在 Android 应用中使用 AsyncTask 和 OkHttpClient 从 API 获取图片,并将图片保存到本地存储。通过代码的优化,可以实现更加完善的图片下载功能。
原文地址: https://www.cveoy.top/t/topic/ctTA 著作权归作者所有。请勿转载和采集!