zoukankan      html  css  js  c++  java
  • 获取网络图片

      好久没写博客了,今天为大家分享一个Android端的小效果--动态获取网络图片。

      现在让我们考虑一下,如何动态获取网络图片呢?首先既然是动态,就必须一个服务器作为支撑,在这里我使用jsp搭建了一个服务器,具体做法如下:

      MyEclipse和Tomcate的配置就不再这里赘述,相关的配置方法,度娘上一搜一大堆。现在我们看一下服务器端都需要干什么?

      1、创建一个工程;2、在WebRoot目录下新建一个imgServer文件夹(用来存放我们的图片资源);3、启动我们的工程;4、打开浏览器输入http://localhost:8080/工程名+/+WebRoot+/+图片名;5、如果浏览器显示了我们设置的图片,就表示我们的服务器搭建完成。下面就可以进行我们的Android端开发了。

      今天Android端的开发,我选择了用谷歌最新发布的Android Studio进行介绍,关于如何安装还是那句话,找度娘。现在我们开始Android端的设计:

    首先介绍界面

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity"
        android:id="@+id/relative">
        <LinearLayout
            android:id="@+id/linear"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/textView"
                android:text="@string/web"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <EditText
                android:id="@+id/editText"
                android:layout_width="200sp"
                android:layout_height="wrap_content"
                android:text="@string/http"
                />
        </LinearLayout>
        <Button
            android:id="@+id/button"
            android:layout_below="@id/linear"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/open"
            />
        <ImageView
            android:id="@+id/imageView"
            android:layout_below="@id/button"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </RelativeLayout>

      界面分为两部分,上半部分就是大家熟悉的一个文本控件、文本输入控件(用来输入网址)、Button按钮;下半部分则是一个用来显示获取得到的网络图片的ImgView控件。

    下面介绍一下主Activity:

    package com.example.administrator.webimg;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    /**
     * 网络图片资源显示
     */
    public class MainActivity extends Activity {
        private EditText mEditText;
        private String text;
        private Button mButton;
        private ImageView mImageView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }
        public void init(){
            mEditText = (EditText)findViewById(R.id.editText);
            mButton = (Button)findViewById(R.id.button);
            mImageView = (ImageView)findViewById(R.id.imageView);
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    text = mEditText.getText().toString();
                    new Thread(new Runnable() {
                        byte[] data;
                        @Override
                        public void run() {
                             data = ImageServer.getImage(text);
                             runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (data != null){
                                        Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                                        mImageView.setImageBitmap(mBitmap);
                                    }else{
                                        mImageView.setImageBitmap(null);
                                        mEditText.setText(R.string.http);
                                        Toast.makeText(getApplicationContext(), "您输入的网址不正确", Toast.LENGTH_LONG).show();
                                    }
                                }
                            });
                        }
                    }).start();
                }
            });
        }
    }

      这里用到了java中的匿名内部类的方法,创建按钮的点击事件。随着Android的不断发展,Android为了给用户提供安全的模式,从Android2.0以后,当需要访问网络资源时需要开启一个子线程进行处理,为了使子线程中的数据在主线程显示,需要使用runOnUiThread()这个方法返回到主线程进行操作。

    网络访问代码:

    package com.example.administrator.webimg;
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    /**
     * 获取网络图片资源
     * Created by Administrator on 2015/1/17.
     */
    public class ImageServer {
        public static byte[] getImage(String text){
            try {
                URL url = new URL(text);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setReadTimeout(5000);
                conn.setRequestMethod("GET");
                if (conn.getResponseCode() == 200) {
                    InputStream inStream = conn.getInputStream();
                    return getByteArr.read(inStream);
                }
            }catch(Exception e){
                e.printStackTrace();
                return null;
            }
            return null;
        }
    }

    处理获得到的数据流代码:

    package com.example.administrator.webimg;
    
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    
    /**
     * 对通过网络获取的二进制数据进行处理
     * Created by Administrator on 2015/1/17.
     */
    public class getByteArr {
        /**
         * 读取流中的数据
         * @param inStream
         * @return
         * @throws Exception
         */
        public static byte[] read(InputStream inStream) throws Exception{
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while( (len = inStream.read(buffer)) != -1){
                outStream.write(buffer, 0, len);
            }
            inStream.close();
            return outStream.toByteArray();
        }
    
    }

      有了这些我们的应用基本完成,最后不要忘记在AndroidManifest.xml添加一个获取网络连接的权限:

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

    效果图: 

     

      到这里我们的Android获取网络动态图片的效果已经完成,大家如有什么疑问,欢迎留言讨论。

  • 相关阅读:
    Java反射机制DOME
    Contos7 装bcm4312无线网卡驱动
    windows8.1+centos7双系统(装完centos后无win8引导)
    request+response
    HTTP协议+servlet配置
    类加载和反射
    线程池+线程安全
    IO流之Properties(String键值对)+序列流+打印流+commons-IO(最终流程)
    IO流之字节流 +字符流 (复制文件)
    IO流
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4234590.html
Copyright © 2011-2022 走看看