当前位置: 首页 > news >正文

Android | 通过URL获取网络图片Bitmap格式

一、获取网络图片URL

        1.随便找一张网络图片   

        2.右键打开图像

        3.复制图片URL (.jpg或者其他图像格式结尾的url才是图片的url(统一资源定位器)啊 =>=)

二、代码

        1.初始化绑定视图

    private Bitmap imgBitmap = null;
    private ImageView ivPhoto;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivPhoto = (ImageView) findViewById(R.id.photo);
        String imgUrl = "https://w.wallhaven.cc/full/l3/wallhaven-l3xk6q.jpg";
        requestWebPhotoBitmap(imgUrl);
    }

        2.网络请求(核心代码)

                 (方法一 :通过 HttpURLConnection 请求)


    /**
     * 通过 网络图片 url 获取图片 Bitmap
     * @param photoUrl 网络图片 url
     */
    private void requestWebPhotoBitmap(String photoUrl) {
        new Thread(() -> {
            HttpURLConnection connection = null;
            try {
                URL bitmapUrl = new URL(photoUrl);
                connection = (HttpURLConnection) bitmapUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                connection.setReadTimeout(5000);

                // 判断是否请求成功
                if (connection.getResponseCode() == 200) {
                    Message hintMessage = new Message();
                    hintMessage.what = HANDLER_START_DOWNLOAD;
                    hintHandler.sendMessage(hintMessage);

                    InputStream inputStream = connection.getInputStream();
                    imgBitmap = BitmapFactory.decodeStream(inputStream);

                    Message message = showHandler.obtainMessage();
                    showHandler.sendMessage(message);
                } else {
                    Message hintMessage = new Message();
                    hintMessage.what = HANDLER_NET_ERROR;
                    hintHandler.sendMessage(hintMessage);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (connection != null) connection.disconnect();
            }
        }).start();
    }
    /**
     * 设置提示
     */
    private final Handler hintHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == HANDLER_START_DOWNLOAD)
                Toast.makeText(MainActivity.this, "获取图片中,请稍等", Toast.LENGTH_SHORT).show();
            else if(msg.what == HANDLER_NET_ERROR)
                Toast.makeText(MainActivity.this, "网络错误,请重试", Toast.LENGTH_SHORT).show();
        }
    };
    /**
     * 展示图片
     */
    @SuppressLint("HandlerLeak")
    private final Handler showHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ivPhoto.setImageBitmap(imgBitmap); //填充控件
        }
    };

                (方法二 : 通过 Glide)


    /**
     * 获取 网络图片 Bitmap
     * @param imgUrl 网络图片url
     */
    private void requestWebPhotoBitmap(String imgUrl) {
        Toast.makeText(MainActivity.this, "获取图片中,请稍等", Toast.LENGTH_SHORT).show();
        Glide.with(MainActivity.this).asBitmap().load(imgUrl).into(new CustomTarget<Bitmap>() {
            @SuppressLint("ClickableViewAccessibility")
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imgBitmap = resource;
                ivPhoto.setImageBitmap(imgBitmap)
            }
            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {

            }
        });
    }

        注意:使用 glide 要在 build.gradle(app)导包

    implementation 'com.github.bumptech.glide:glide:4.11.0'

        3.布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center" >

    <ImageView
        android:id="@+id/photo"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:layout_gravity="center"
        android:scaleType="centerInside" >
    </ImageView>

</FrameLayout>

三、效果

相关文章:

  • SpringCloud-01 Rest学习环境搭建笔记
  • 基于APB与I2C的多主多从架构设计 - Function Description
  • R语言 ggdendro_谱系图
  • Kafka原理及概念解释
  • Springboot-自定义Spring Boot Starter并推送到远端公服
  • 《奔跑吧,程序员:从零开始打造产品、技术和团队》 读书笔记
  • PHP - 各版本对比 - 整理
  • JAVA 常见算法(选择排序,二分查找)
  • 【dotnet】Unity IL2CPP Mono
  • HC32L110(五) Ubuntu20.04 VSCode的Debug环境配置
  • 牛客 NC24307 [USACO 2012 Dec S]Milk Routing
  • . Flume面试题
  • 来了 Android开发中高级进阶通关全文档
  • CONTINUOUS CONTROL WITH DEEP REINFORCEMENT LEARNING
  • 【Dubbo】入门搭建
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 控件背景颜色处理
  • Android组件 - 收藏集 - 掘金
  • Hexo+码云+git快速搭建免费的静态Blog
  • JAVA多线程机制解析-volatilesynchronized
  • oschina
  • Redis字符串类型内部编码剖析
  • socket.io+express实现聊天室的思考(三)
  • SpriteKit 技巧之添加背景图片
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 高性能JavaScript阅读简记(三)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 区块链将重新定义世界
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 硬币翻转问题,区间操作
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 追踪解析 FutureTask 源码
  • elasticsearch-head插件安装
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # include “ “ 和 # include < >两者的区别
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (2)(2.10) LTM telemetry
  • (Git) gitignore基础使用
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)平衡树
  • .equals()到底是什么意思?
  • .java 9 找不到符号_java找不到符号
  • .Mobi域名介绍
  • .NET BackgroundWorker
  • .NET MVC第三章、三种传值方式
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net访问oracle数据库性能问题