当前位置:首页 > 行业动态 > 正文

安卓怎么从网站获取图片

准备工作

添加网络权限

AndroidManifest.xml 中声明网络访问权限:

<uses-permission android:name="android.permission.INTERNET" />

若需要保存图片到本地,还需添加存储权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

常用实现方式

使用第三方库(推荐)

(1) Glide

步骤:

安卓怎么从网站获取图片  第1张

  1. 添加依赖(在 build.gradle 中):
    implementation 'com.github.bumptech.glide:glide:4.15.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'
  2. 代码实现
    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

步骤:

  1. 添加依赖
    implementation 'com.squareup.picasso:picasso:2.8'
  2. 代码实现
    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 请求(手动处理)

步骤:

  1. 异步加载图片(避免阻塞主线程):

    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();
  2. 保存图片到本地(可选):

    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需切换到主线程
    }
});
0