Android学习笔记---23_网络通信之网络图片查看器

来源:互联网 发布:源码翻译 编辑:程序博客网 时间:2024/05/01 17:44
Android学习笔记---23_网络通信之网络图片查看器
23_网络通信之网络图片查看器
----------------------------------------------
1.从Internet获取数据
------------------------------
利用HttpURLConnection对象,我们可以从网络中获取网页数据.
URL url = new URL("http://www.sohu.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5* 1000);//设置连接超时
conn.setRequestMethod(“GET”);//以get方式发起请求
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream is = conn.getInputStream();//得到网络返回的输入流
String result = readData(is, "GBK");
conn.disconnect();
//第一个参数为输入流,第二个参数为字符集编码
public static String readData(InputStream inSream, String charsetName) throws 

Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while( (len = inSream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inSream.close();
return new String(data, charsetName);
}
利用HttpURLConnection对象,我们可以从网络中获取文件数据.
URL url = new URL("http://photocdn.sohu.com/20100125/Img269812337.jpg");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5* 1000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream is = conn.getInputStream();
readAsFile(is, "Img269812337.jpg"); 

public static void readAsFile(InputStream inSream, File file) throws Exception{
FileOutputStream outStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = -1;
while( (len = inSream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
 outStream.close();
inSream.close();
}

----------------------------------------------------------------
2.下面是一个应用:
  通过用户输入的一个网络图片的地址,来获取网络图片
----------------------------------------------------------
3.创建项目:netimage
/netimage/src/com/credream/netimage/NetimageActivity.java
 package com.credream.netimage;


import com.credream.service.ImageService;


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;
import android.widget.SimpleAdapter.ViewBinder;


public class NetimageActivity extends Activity {
   
 /** Called when the activity is first created. */
  
 private EditText pathText;
  
 private ImageView imageView;
 
  @Override
   
 public void onCreate(Bundle savedInstanceState) {
   
     super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
  
 pathText=(EditText)this.findViewById(R.id.imagepath);
  
 imageView=(ImageView)this.findViewById(R.id.imageview);
   Button button=

(Button)this.findViewById(R.id.button);
   button.setOnClickListener(new 

ButtonOnClickListener());
   

    }
  
  private final class ButtonOnClickListener implements View.OnClickListener{


@Override
public void onClick(View v)
{
String path=pathText.getText().toString();

//以字节数组存放图片的数据
byte[] data;
try
{
data = ImageService.getImage(path);
Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);
//使用数组的全部数据来创建位图对象
imageView.setImageBitmap(bitmap);

catch (Exception e)
{
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.error, 1).show();

//当用户访问网络的时候,需要访问网络权限,因为可能把用户手机的东西传到网上
}
}
    
  
  } 
}
-------------------------------------------------------------------------
3./netimage/src/com/credream/service/ImageService.java
package com.credream.service;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import com.credream.util.StreamTool;

public class ImageService
{
/**
 * 获取网络图片的数据
 * @param path 网络图片的路径
 * @return
 */
public static byte[] getImage(String path)throws Exception
{
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();//基于

Http协议链接对象
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
//InputStream inputStream=conn.getInputStream();//得到的返回数据,可能是错

误的比如,404
//错误的时候,也返回数据,但是返回的事错误数据不是所需要的
if(conn.getResponseCode()==200){
InputStream inStream=conn.getInputStream();
returnStreamTool.read(inStream);//返回从流中读取的2进制数据
}
return null;
}

}
----------------------------------------------------------
4./netimage/src/com/credream/util/StreamTool.java
package com.credream.util;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
 * 读取流中的数据
 * @author xiaofeng
 *
 */
public class StreamTool
{
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();
}

}
---------------------------------------------
4./netimage/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/imagepath" />
  <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imagepath" 
        android:text="http://192.168.1.110:6118/web/logo.gif"/>
  <!--http://localhost:6118/web/logo.gif注意这个网站的地址是不能访问的,因为这个时

候,他会从android的系统中找这个
  部署的项目,但是找不到所以,要使用局域网的ip来访问,这个地址
  http://192.168.1.110:6118/web/logo.gif也就是本机的ip地址.-->
  <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button"
        android:id="@+id/button" />
    <ImageView 
           android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         android:id="@+id/imageview" 
         />
    
</LinearLayout>
----------------------------------------------------
5./netimage/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, NetimageActivity!</string>
    <string name="app_name">网络通信之网络图片查看器</string>
     <string name="imagepath">网络图片路径</string>
       <string name="button">查看图片</string>
         <string name="error">获取图片失败</string>

</resources>
-----------------------------------------
6./netimage/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.credream.netimage"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".NetimageActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
<!-- 访问internet权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
        
</manifest>
------------------------------------------------------------
7.新建一个web项目:web
 a./web/WebContent/logo.gif
   直接访问就好了
------------------------------------
8.开始测试:
  a.首先把netimage项目部署在android的平台上
  c.运行web项目,右键run on server
----------------------------------------------------------------
1.注意获取网络上的任何数据都是一样的:
  a.首先获取数据流
  b.得到二进制数据,得到二进制数据后,然后就可以生成你需要格式的文件
---------------------------------------------------------------

原创粉丝点击