• 安卓案例:利用URLConnection下载图片


    一、安卓网络编程

    在这里插入图片描述

    二、运行效果

    • 输入图片网址,下载并显示图片
      在这里插入图片描述

    三、涉及知识点

    1. 线性布局(LinearLayout)
    2. 图像视图(ImageView·)
    3. 文本编辑框(EditText)
    4. 按钮(Button)
    5. 网址连接类(URLConnection)
    6. 异步任务(AsyncTask)
      在这里插入图片描述

    四、实现步骤

    (一)创建安卓应用

    • 基于Empty Activity创建安卓应用 - DownloadImagePageByURLConnection
      在这里插入图片描述
      在这里插入图片描述

    (二)准备图片素材

    • 将背景图片拷贝到mipmap-xhdpi目录
      在这里插入图片描述

    (三)主布局资源文件

    • 主布局资源文件 - main_activity.xml
      在这里插入图片描述
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/background"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp">
    
        <EditText
            android:id="@+id/edtImageUrl"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/input_image_url"
            android:lines="3" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btnDownload"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="20dp"
                android:onClick="doDownload"
                android:text="@string/download"
                android:textSize="20sp" />
    
            <Button
                android:id="@+id/btnClear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClear"
                android:text="@string/clear"
                android:textSize="20sp" />
        LinearLayout>
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#bbbbbb" />
    
        <ProgressBar
            android:id="@+id/pbDownloadImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    
        <ImageView
            android:id="@+id/ivImage"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY" />
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    (四)字符串资源文件

    • 字符串资源文件 - strings.xml
      在这里插入图片描述
    <resources>
        <string name="app_name">利用URLConnection下载图片string>
        <string name="input_image_url">输入图片网址string>
        <string name="download">下载string>
        <string name="clear">清空string>
    resources>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (五)授权访问因特网

    • 在安卓项目清单文件里授权访问因特网
      在这里插入图片描述

    (六)在主界面里实现功能

    • 主界面 - MainActivity
      在这里插入图片描述

    1、声明变量,获取控件实例

    • 声明三个控件变量,然后获取控件实例
      在这里插入图片描述

    2、创建下载资源的异步任务类

    • 在MainActivity里继承AsyncTask创建DownloadTask
      在这里插入图片描述
    /**                                                                                      
     * 下载资源的异步任务                                                                             
     */                                                                                      
    private class DownloadTask extends AsyncTask<String, Void, Bitmap> {                     
        // 异步任务执行前要执行的操作                                                                     
        @Override                                                                            
        protected void onPreExecute() {                                                      
            super.onPreExecute();                                                            
            // 让进度条可见                                                                        
            pbDownloadImage.setSystemUiVisibility(View.VISIBLE);                             
        }                                                                                    
                                                                                             
        // 后台进行的耗时操作                                                                         
        @Override                                                                            
        protected Bitmap doInBackground(String... params) {                                  
            // 获取图片网址字符串                                                                     
            String strImageUrl = params[0];                                                  
            // 定义位图对象                                                                        
            Bitmap bitmap = null;                                                            
            try {                                                                            
                // 定义URL对象                                                                   
                URL url = new URL(strImageUrl);                                              
                // 定义URL连接对象                                                                 
                URLConnection connection = url.openConnection();                             
                // 获取字节输入流                                                                   
                InputStream is = connection.getInputStream();                                
                // 解析字节输入流获取位图对象                                                             
                bitmap = BitmapFactory.decodeStream(is);                                     
            } catch (MalformedURLException e) {                                              
                e.printStackTrace();                                                         
            } catch (IOException e) {                                                        
                e.printStackTrace();                                                         
            }                                                                                
                                                                                             
            // 返回位图对象                                                                        
            return bitmap;                                                                   
        }                                                                                    
                                                                                             
        // 异步任务执行后要执行的操作                                                                     
        @Override                                                                            
        protected void onPostExecute(Bitmap bitmap) {                                        
            super.onPostExecute(bitmap);                                                     
            // 让进度条消失                                                                        
            pbDownloadImage.setVisibility(View.GONE);                                        
            // 通过图像控件显示位图                                                                    
            ivImage.setImageBitmap(bitmap);                                                  
        }                                                                                    
    }                                                                                                                                                                                                                  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    3、编写下载按钮单击事件处理方法

    • 编写doDownload(View view)方法
      在这里插入图片描述
    /**                                                                   
     * 下载按钮单击事件处理方法                                                       
     *                                                                    
     * @param view                                                        
     */                                                                   
    public void doDownload(View view) {                                   
        // 获取图片网址字符串                                                      
        String strImageUrl = edtImageUrl.getText().toString().trim();     
        // 创建下载任务                                                         
        DownloadTask task = new DownloadTask();                           
        // 执行下载任务,传入图片网址                                                  
        task.execute(strImageUrl);                                        
    }                                                                                                                                                                                          
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、编写清空按钮单击事件处理方法

    • 编写doClear(View view)方法
      在这里插入图片描述
    /**                                              
     * 清空按钮单击事件处理方法                                  
     *                                               
     * @param view                                   
     */                                              
    public void doClear(View view) {                 
        // 清空图片网址编辑框                                 
        edtImageUrl.setText("");                     
        // 清空图像控件                                    
        ivImage.setImageBitmap(null);                
        // 让图片网址编辑框获取焦点                              
        edtImageUrl.requestFocus();                  
    }                                                                 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (七)查看要下载的网络图片

    (八)运行程序,查看结果

    • 输入图片网址,下载并显示图片
      在这里插入图片描述

    (九)下载并显示Tomcat服务器上的图片

    1、在服务器上准备图片

    • 在Tomcat主目录的webapps目录里创建images,在里面放一张图片winter.jpg
      在这里插入图片描述

    2、启动Tomcat服务器

    • 找到startup.bat批处理文件
      在这里插入图片描述
    • 双击startup.bat批处理文件图标,启动服务
      在这里插入图片描述

    3、在浏览器里访问服务器上的图片

    • 访问http://localhost:8080/images/winter.png
      在这里插入图片描述
    • 查看本机IP地址 - 192.168.129.112
      在这里插入图片描述
    • 访问http://192.168.129.112:8080/images/winter.png
      在这里插入图片描述

    4、安卓应用里下载并显示本机服务器上的图片

    • 注意:图片网址只能用IP地址 - http://192.168.129.112:8080/images/winter.png,不能用http://localhost:8080/images/winter.png,因为在安卓模拟器上运行安卓应用,localhost指的不是本地的Tomcat服务器,而是安卓模拟器。
      在这里插入图片描述
      在这里插入图片描述

    五、爬取单张图片

    (一)目标所在页面

    (二)编写程序,爬取图片

    • 编写Python程序 - 爬取单张图片.py
      在这里插入图片描述
    """
    功能:爬取单张图片
    作者:华卫
    日期:2022年7月19日
    """
    
    # 1. 导入所需库
    import requests
    from lxml import etree
    
    # 2. 定义网页地址
    url = 'https://pic.netbian.com/tupian/29800.html'
    
    # 3. 定义headers
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
    }
    
    # 4. 模拟发送请求,获取网页内容
    response = requests.get(url, headers)
    content = response.content.decode('gbk')
    
    # 5. 规则提取数据
    html = etree.HTML(content)
    # //:表示全程搜索,[@属性=属性值]:表示按属性值过滤
    a_res = html.xpath("//a[@id='img']")[0]
    img_res = a_res.xpath("./img")[0]
    img_url = img_res.xpath("./@src")[0]
    img_title = img_res.xpath("./@title")[0]
    
    # 6. 下载爬取的图片并保存到本地
    filename = '%s.jpg' % img_title
    with open('image/' + filename, 'wb') as f:
        img = requests.get('https://pic.netbian.com' + img_url, headers).content
        f.write(img)
    print('图片[{}]下载并保存成功~'.format(filename))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    (三)运行程序,查看结果

    • 查看控制台输出信息
      在这里插入图片描述
    • 查看下载到本地的图片
      在这里插入图片描述
  • 相关阅读:
    C++中的文件输入/输出
    媒体服务器与视频服务器有什么区别
    【ES6】-- 对象、数组、字符串常用API
    10个python爬虫入门实例
    深入解读Prometheus Adapter:云原生监控的核心组件
    SQLite3 数据库学习(四):Qt 数据库基础操作
    Java_关键字this的使用
    中国乙腈市场预测与战略咨询研究报告(2022版)
    linux 夺命100问
    基于MxNet实现目标检测-YoloV4【附部分源码及模型】
  • 原文地址:https://blog.csdn.net/howard2005/article/details/125865649