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

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓案例:利用URLConnection下载图片相关的知识,希望对你有一定的参考价值。

文章目录

一、安卓网络编程

二、运行效果

  • 输入图片网址,下载并显示图片

三、涉及知识点

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

四、实现步骤

(一)创建安卓应用

  • 基于Empty Activity创建安卓应用 - DownloadImagePageByURLConnection

(二)准备图片素材

  • 将背景图片拷贝到mipmap-xhdpi目录

(三)主布局资源文件

  • 主布局资源文件 - main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<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>

(四)字符串资源文件

  • 字符串资源文件 - strings.xml
<resources>
    <string name="app_name">利用URLConnection下载图片</string>
    <string name="input_image_url">输入图片网址</string>
    <string name="download">下载</string>
    <string name="clear">清空</string>
</resources>

(五)授权访问因特网

  • 在安卓项目清单文件里授权访问因特网

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

  • 主界面 - 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);                                                  
                                                                                        
                                                                                                                                                                                                                  

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

  • 编写doDownload(View view)方法
/**                                                                   
 * 下载按钮单击事件处理方法                                                       
 *                                                                    
 * @param view                                                        
 */                                                                   
public void doDownload(View view)                                    
    // 获取图片网址字符串                                                      
    String strImageUrl = edtImageUrl.getText().toString().trim();     
    // 创建下载任务                                                         
    DownloadTask task = new DownloadTask();                           
    // 执行下载任务,传入图片网址                                                  
    task.execute(strImageUrl);                                        
                                                                                                                                                                                          

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

  • 编写doClear(View view)方法
/**                                              
 * 清空按钮单击事件处理方法                                  
 *                                               
 * @param view                                   
 */                                              
public void doClear(View view)                  
    // 清空图片网址编辑框                                 
    edtImageUrl.setText("");                     
    // 清空图像控件                                    
    ivImage.setImageBitmap(null);                
    // 让图片网址编辑框获取焦点                              
    edtImageUrl.requestFocus();                  
                                                                 

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

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

  • 输入图片网址,下载并显示图片

(九)下载并显示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))

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

  • 查看控制台输出信息
  • 查看下载到本地的图片

以上是关于安卓案例:利用URLConnection下载图片的主要内容,如果未能解决你的问题,请参考以下文章

安卓案例:利用URLConnection下载网页

安卓案例:利用URLConnection下载音乐

安卓案例:利用URLConnection下载网页

安卓案例:利用URLConnection下载音乐

安卓小案例收集二

使用URLConnection下载文件或图片并保存到本地