上一篇
安卓怎么从网站获取图片
- 行业动态
- 2025-04-21
- 7
准备工作
添加网络权限
在 AndroidManifest.xml
中声明网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
若需要保存图片到本地,还需添加存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
常用实现方式
使用第三方库(推荐)
(1) Glide
步骤:
- 添加依赖(在
build.gradle
中):implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
- 代码实现:
ImageView imageView = findViewById(R.id.imageView); Glide.with(this) .load("https://example.com/image.jpg") // 图片URL .placeholder(R.drawable.loading) // 加载占位图 .error(R.drawable.error) // 加载失败默认图 .into(imageView);
(2) Picasso
步骤:
- 添加依赖:
implementation 'com.squareup.picasso:picasso:2.8'
- 代码实现:
ImageView imageView = findViewById(R.id.imageView); Picasso.get() .load("https://example.com/image.jpg") .placeholder(R.drawable.loading) .error(R.drawable.error) .into(imageView);
原生 HTTP 请求(手动处理)
步骤:
异步加载图片(避免阻塞主线程):
new Thread(() -> { try { URL url = new URL("https://example.com/image.jpg"); InputStream input = url.openStream(); Bitmap bitmap = BitmapFactory.decodeStream(input); runOnUiThread(() -> imageView.setImageBitmap(bitmap)); // 更新UI } catch (Exception e) { e.printStackTrace(); } }).start();
保存图片到本地(可选):
File file = new File(Environment.getExternalStorageDirectory(), "image.jpg"); try (FileOutputStream out = new FileOutputStream(file)) { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); } catch (Exception e) { e.printStackTrace(); }
注意事项
问题 | 解决方案 |
---|---|
内存溢出 | 使用 BitmapFactory.Options 设置 inSampleSize 压缩图片 |
SSL证书错误 | 配置 HttpURLConnection 跳过证书验证(不推荐)或使用信任的证书 |
图片缓存 | 使用第三方库自带缓存机制,或手动集成 LruCache |
完整示例(Glide + 权限处理)
// AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> // MainActivity.java ImageView imageView = findViewById(R.id.imageView); Glide.with(this) .load("https://example.com/image.jpg") .diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存到磁盘 .into(imageView);
相关问题与解答
问题1:如何优化大图加载导致的内存溢出?
解答:
使用 BitmapFactory.Options
进行图片采样:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(input, null, options); options.inSampleSize = calculateInSampleSize(options, 800, 600); // 计算缩放比例 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeStream(input, null, options);
问题2:如何为图片加载设置超时时间?
解答:
使用 OkHttp
自定义网络请求:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(10, TimeUnit.SECONDS) // 读取超时 .build(); Request request = new Request.Builder() .url("https://example.com/image.jpg") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理失败 } @Override public void onResponse(Call call, Response response) throws IOException { InputStream input = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(input); // 更新UI需切换到主线程 } });