zoukankan      html  css  js  c++  java
  • Android通过IO流获取服务器的图片数据

    在Android开发中,经常需要从后台服务器下载图片进行显示。虽然有很多现成的开源框架使用,给定一个url,进行一些配置后,直接就能加载图片显示,缓存都做好了。但是有的场景,例如涉及安全、隐私的场合,不能直接拿一个公开的url使用,还是需要通过原始数据流的方法来获取图片。

    通过请求参数,进行一些验证,能提高安全性。这里以最简单的IO流为例,没有涉及到图片缓存。好,废话不多说,直接上代码:

    package com.example.downloadpictest;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Date;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        private ImageView ivImg;
        private Button btnDownload;
        private Bitmap img;
        private ImageHandler imgHandler = new ImageHandler();
        //测试Url
        private String url = "http://192.168.42.193:8080/DownloadPicTest/servlet/DownloadServlet"; 
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ivImg = (ImageView) findViewById(R.id.ivImg);
            btnDownload = (Button) findViewById(R.id.btnDownload);
            //点击按钮开始下载
            btnDownload.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    downloadImg();
                }
            });
        }
    
        /**
         * 异步从服务器加载图片数据
         */
        private void downloadImg(){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Bitmap img =  getImg();
                    Message msg = imgHandler.obtainMessage();
                    msg.what = 0;
                    msg.obj = img;
                    imgHandler.sendMessage(msg); 
                }
            }).start();
        }
    
        /**
         * 异步线程请求到的图片数据,利用Handler,在主线程中显示
         */
        class ImageHandler extends Handler{
            @Override
            public void handleMessage(Message msg) {
    
                switch (msg.what) {
                case 0:
                    img = (Bitmap)msg.obj;
                    if(img != null){
                        ivImg.setImageBitmap(img);
                    }
                    break;
    
                default:
                    break;
                }
            }
        }
    
        /**
         * 从服务器读取图片流数据,并转换为Bitmap格式
         * @return Bitmap
         */
        private Bitmap getImg(){
            Bitmap img = null;
    
            try {
                URL imgUrl = new URL(url);          
                HttpURLConnection conn = (HttpURLConnection) imgUrl.openConnection();
    
                conn.setRequestMethod("POST");
                conn.setConnectTimeout(1000 * 6);
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setUseCaches(false);
    
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Charset", "UTF-8");
                conn.connect();
    
                //输出流写参数
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                String param = getParam();
                dos.writeBytes(param);
                dos.flush();
                dos.close();
    
                int resultCode = conn.getResponseCode();
    
                if(HttpURLConnection.HTTP_OK == resultCode){
                    InputStream is = conn.getInputStream();
                    img = BitmapFactory.decodeStream(is);
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return img;
        }
    
        /**
         * 测试参数
         * @return 
         */
        private String getParam(){
            JSONObject jsObj = new JSONObject();
            try {
                jsObj.put("picFormat", "jpg");
                jsObj.put("testParam", "9527");
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            return jsObj.toString();
        }
    }
    

    代码很好理解,就不做过多说明了。注意不要忘了在Manifest中配置网络权限

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

    效果图如下
    下载效果图

    至于服务器响应图片数据流,可以参考我自己写的一个简单示例: http://blog.csdn.net/ceovip/article/details/79100451

  • 相关阅读:
    开发导致的内存泄露问题,运维小伙伴儿这样排查不背锅
    JVM垃圾回收器、内存分配与回收策略
    笔试编程(二) | 7种常见的排序算法解析(附实现代码)
    HBase高级特性、rowkey设计以及热点问题处理
    Geotools创建Feature的两种方式
    geotools实现追加数据到数据库
    Java连接mysql数据库经典代码
    leaflet加载高德地图和Geoserver的WMS服务
    geotools学习之连接数据库并获取数据
    LeaFlet中切片图层使用自定义坐标系
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956018.html
Copyright © 2011-2022 走看看