实现Android客户端接收Web Services服务端传输的多张图片并显示的功能。

    Web Services 服务端:

   @WebService

   public interface ITransPic {  

@WebResult(name = "getPictures")

    public FileDto transPic(@WebParam(name="folderName") String folderName);

}

注明:因为是测试代码,入参folderName在后面并未使用。

public class TransPicImpl implements ITransPic {

ArrayList<PicFile> fileList = null;

FileInputStream fis  = null;     //文件流对象

PicFile picFile = null;          //文件图片对象

ByteArrayOutputStream bos = null;

File file = null;

byte[] buffer = null;

FileDto fileDto = new FileDto();

String filePath = "F:\\Desktop\\pictures";

@Override

public FileDto transPic(String folderName) {

// TODO Auto-generated method stub

fileList = new ArrayList<PicFile>();

try {

file = new File(filePath);

File[] array = file.listFiles();

System.out.println("共有"+array.length+"张图片");

//读取每张图片

for (int i = 0; i < array.length; i++){

picFile = new PicFile();

fis = new FileInputStream(filePath+"\\"+(i+1)+".jpg");

bos = new ByteArrayOutputStream();

buffer = new byte[8092];

int count = 0;

while((count = fis.read(buffer)) > 0){

bos.write(buffer, 0, count);

}

String downloadBuffer = new String(Base64.encode(bos.toByteArray()));

picFile.setFileName((i+1)+".jpg");

picFile.setDownloadBuffer(downloadBuffer);

fileList.add(picFile);

}

fileDto.setFileLenth(array.length);

fileDto.setFileList(fileList);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return fileDto;

}

}

 其中FileDto的代码为:

public class FileDto {

private ArrayList<PicFile> fileList;

private int fileLenth;

@XmlElementWrapper(name = "files")

@XmlElements(@XmlElement(name = "file", type = PicFile.class))

public ArrayList<PicFile> getFileList() {

return fileList;

}

public void setFileList(ArrayList<PicFile> fileList) {

this.fileList = fileList;

}

public int getFileLenth() {

return fileLenth;

}

public void setFileLenth(int fileLenth) {

this.fileLenth = fileLenth;

}

}

PicFile包括fileName(文件名)与downloadBuffer两个属性。

服务发布后的wsdl为:

在浏览器中输入调用方法transPic的URL:http://localhost:8080/WSPic/TransPicService/transPic?folderName=1,显示:

    可以看到files就是@XmlElementWrapper的名字,其下有10个以“file”命名的PicFile对象。利用@XmlElementWrapper、@XmlElements等注释,可以帮助Android客户端解析xml格式的数据。

    其中,每个file的xml数据为:

    说明:由于Java WebService传入参数的特殊性(虽然定义的参数是Java支持的参数,但是通过链接传入的参数的类型都为String),所以图片需要通过Base64编码,转化为String类型。

Android客户端:

需要的jar包:commons-codec-1.7.jar以及Ksoap的jar包。

public class WebService {

private final String NAME_SPACE = "http://service.yan.cn/";

private final String URL = "http://192.168.10.200:8080/WSPic/TransPicService";

private final String GET_METHOD_NAME  = "transPic";

       private final String GET_RESPONSE_OPERATION="http://192.168.10.200:8080/WSPic/TransPicService/transPic";

       private ArrayList<PicFile> picFileList = new ArrayList<PicFile>();

       private PicFile picFile = null;

       private int fileNumber = 0;

public ArrayList<PicFile> getPicByte(){

SoapObject rpc = new SoapObject(NAME_SPACE,GET_METHOD_NAME);

rpc.addProperty("folderName","12");

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut = rpc;

envelope.setOutputSoapObject(rpc);

AndroidHttpTransport ht = new AndroidHttpTransport(URL);//用http传输,wsdl地址

ht.debug = true;//允许调试

try {

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("调用call之前时间:"+df.format(new Date()));

ht.call(GET_RESPONSE_OPERATION, envelope);

System.out.println("调用call之后时间:"+df.format(new Date()));

System.out.println("envelop=="+envelope);

SoapObject detail =(SoapObject)envelope.getResponse();

SoapObject result = (SoapObject)detail.getProperty("files");

System.out.println("fileNumber初始值=="+fileNumber);

fileNumber = result.getPropertyCount();

System.out.println("fileNumber=="+fileNumber);

//一次取出fileNumber张图片

for (int i = 0; i < fileNumber; i ++){

SoapObject tempObject = (SoapObject)result.getProperty(i);

picFile = new PicFile();

picFile.setDownloadBuffer(tempObject.getProperty("downloadBuffer").toString());

picFile.setFileName(tempObject.getProperty("fileName").toString());

picFileList.add(picFile);

}

} catch (Exception e) {

e.printStackTrace();

}

return picFileList;

}

}

至此,picFileList已包含所有图片的信息。若要显示图片,用Base64解码即可:

 

   for (int i = 0; i < filePicList.size(); i++){

    buffer = new Base64().decode(filePicList.get(i).getDownloadBuffer());

    imgeViewList.get(i).setImageBitmap(BitmapFactory.decodeByteArray(buffer, 0, buffer.length));

   }