Android 使用 OkHttpClient 和 DownloadManager 下载图片并保存
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);
downloadImage(MainActivity.this, imageUrl, downloadDir.getAbsolutePath(), fileName);
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();
}
public void downloadImage(Context context, String url, String downloadDir, String fileName) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false)
.setTitle(fileName)
.setMimeType('image/jpeg')
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDestinationInExternalPublicDir(downloadDir, fileName);
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
downloadManager.enqueue(request);
}
代码说明:
- 获取图片链接: 使用 OkHttpClient 发送 HTTP 请求获取 API 接口数据,解析 JSON 数据获取图片链接。
- 下载图片: 使用 DownloadManager 下载图片,并设置文件保存路径和文件名。
- 处理错误: 代码包含错误处理,在获取链接或下载失败时会提示用户。
- 提示用户: 使用 Toast 提示用户下载成功或失败。
改进建议:
- 可以添加进度条显示下载进度。
- 可以使用更友好的用户界面来提示用户。
- 可以考虑使用其他库来进行图片下载,例如 Glide 或 Picasso。
注意:
请在 AndroidManifest.xml 文件中添加 INTERNET 权限和 WRITE_EXTERNAL_STORAGE 权限。
<uses-permission android:name='android.permission.INTERNET' />
<uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE' />
原文地址: https://www.cveoy.top/t/topic/csoT 著作权归作者所有。请勿转载和采集!