andorid 平台调用Web Service , 图片传输
今天学习了下android调用web service,进行图片传输
下面是代码详解:
onActivityResult 方法在图片剪裁完成之后调用:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK)
            return;
        switch (requestCode) {
            case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的
                final Bitmap photo = data.getParcelableExtra("data");   //获取剪裁后的图片
                try{
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    byte[] bytes =  baos.toByteArray(); //把图片变成byte数组
                    //下面的代码我也不太明白什么意思,好像在4.1主线程直接访问web service的时候会报异常 ,
                    //从Android 2.3开始提供了一个新的类StrictMode,可以帮助开发者改进他们的Android应用,
                    //StrictMode可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者使其改进程序,
                    //使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞,导致ANR窗口的发生。 //http://www.cnblogs.com/zelos/archive/2011/02/27/1966403.html
                    //最后通过上面的url中的解决方案会编译报错,最后在网上找到了这个解决方案
                    Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                            .getContextClassLoader());
                    Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
                            .currentThread().getContextClassLoader());
                    Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
                            Thread.currentThread().getContextClassLoader());
                    Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
                    Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
                    Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
                    Method buildMethod = threadPolicyBuilderClass.getMethod("build");
                    Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
                    Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();
                    Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);
                    obj = penaltyMethod.invoke(obj);
                    Object threadPolicyObject = buildMethod.invoke(obj);
                    setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);
                    //------------
                    //把byte通过Base64变成字符串,通过web service 传送
                    String imgStream = Base64.encodeToString(bytes, 100);
                    CallWebService(imgStream);
                }
                catch(Exception ex)
                {
                    Log.e("error:", ex.toString());
                }
                ImageView img = (ImageView)findViewById(R.id.imgView);
                img.setImageBitmap(photo);
                System.out.println("set new photo");
                break;
            }
            case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片
                final Bitmap photo = data.getParcelableExtra("data");
                doCropPhoto(photo);
                break;
            }
        }
    }
下面是访问web service的代码:
// 命名空间
String nameSpace = "http://192.168.1.110:800/";
// 调用的方法名称
String methodName = "GetFile";
// EndPoint
String endPoint = "http://192.168.1.110:800/WebService1.asmx";
// SOAP Action
String soapAction = "http://192.168.1.110:800/GetFile"; private void CallWebService(String imageStream) {
try {
// 通过soap访问web service
SoapObject soapObject = new SoapObject(nameSpace, methodName);
soapObject.addProperty("imgStream", imageStream); //设置参数 SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); //构造SOAP协议的版本号,该版本号需要根据服务端WebService的版本号设置
envelope.bodyOut = soapObject;//该属性的值是创建的SoapObject对象。
envelope.dotNet = true; HttpTransportSE ht=new HttpTransportSE(endPoint);
ht.debug = true;
ht.call(soapAction, envelope); //第2个参数是创建的SoapSerializationEnvelope对象 if(envelope.getResponse()!=null)
{
SoapObject soapResult =(SoapObject) envelope.getResponse(); //使用getResponse方法获得WebService方法的返回结果
String result = soapResult.getProperty(0).toString();
Toast.makeText(getApplicationContext(), "img Name:"+result,
Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
上面的是 android客户端的代码,下面的是web service中的代码
[WebService(Namespace = "http://192.168.1.110:800/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string GetFile(string imgStream)
{
if (string.IsNullOrEmpty(imgStream))
{
return "false";
}
try
{
byte[] buffer = Convert.FromBase64String(imgStream);
MemoryStream ms = new MemoryStream(buffer);
string fileName = GenderImgFileName();
System.Drawing.Image.FromStream(ms).Save(@"d:\" + fileName);
return fileName;
}
catch (Exception)
{
return "false";
}
} private string GenderImgFileName()
{
return DateTime.Now.ToString("yyyy-MM-dd") + Guid.NewGuid() + ".jpg";
}
上面的就完成了。
C#中byte[] 和 Base64 之间的转换:
{    
    string factString = "中华人民共和国";
    byte[] myByte;
    string Base64Str;
    //先把字符串按照utf-8的编码转换成byte[]
    Encoding myEncoding = Encoding.GetEncoding("utf-8");
    //myByte中获得这样的字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
    myByte = myEncoding.GetBytes(factString);
    //把byte[]转成base64编码,这个例子形成的base64编码的unicode等价字符串为:"5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9"
    Base64Str = Convert.ToBase64String(myByte);
    //再从base64编码转成byte[],又恢复为字节数组:228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
    myByte = Convert.FromBase64String(Base64Str);
    //用同一个Encoding对象把byte[]转成字符串:"中华人民共和国"
    factString = myEncoding.GetString(myByte);
    Console.WriteLine(factString);
}
原文地址:http://www.cnblogs.com/chnking/archive/2007/08/12/852669.html
android中Bitmap,byte[] 和Drawable相关的转换:http://www.cnblogs.com/fighter/archive/2012/02/20/android-bitmap-drawable.html
final Bitmap photo = data.getParcelableExtra("data");  
                
                try{
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    byte[] bytes =  baos.toByteArray();
Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                            .getContextClassLoader());
Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
                            .currentThread().getContextClassLoader());
Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
                            Thread.currentThread().getContextClassLoader());
Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);
Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
                    Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
                    Method buildMethod = threadPolicyBuilderClass.getMethod("build");
Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
                    Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();
Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);
obj = penaltyMethod.invoke(obj);
                    Object threadPolicyObject = buildMethod.invoke(obj);
                    setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);
                    
                    String imgStream = Base64.encodeToString(bytes, 100);
                    CallWebService(imgStream);
                }
                catch(Exception ex)
                {
                    Log.e("error:", ex.toString());
                }
                ImageView img = (ImageView)findViewById(R.id.imgView);
                img.setImageBitmap(photo);
andorid 平台调用Web Service , 图片传输的更多相关文章
- Android平台调用Web Service:演示样例
		
近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...
 - WinCE数据通讯之Web Service分包传输篇
		
前面写过<WinCE数据通讯之Web Service篇>那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出. ...
 - Android平台调用Web Service:螺纹的引入
		
连接文本 剩下的问题 MainActivity的onCreate方法中假设没有有这段代码: // 强制在UI线程中操作 StrictMode.setThreadPolicy(new StrictMod ...
 - Android平台调用Web Service:线程返回值
		
接上文 前文中的遗留问题 对于Java多线程的理解,我曾经只局限于实现Runnable接口或者继承Thread类.然后重写run()方法.最后start()调用就算完事,可是一旦涉及死锁以及对共享资源 ...
 - Web Service 附件技术的发展及演变
		
Web Service 通常将业务数据封装在 SOAP 主体或者 SOAP 消息附件中进行传输,这些附件往往采用 Base64 编码二进制方式进行封装,这将大大增加待传输的数据量,消耗比较长的编码时间 ...
 - C# Web Service简介及使用
		
一. 软件开发的形式 1.SaaS:Software as a Service(软件即服务) (1)将软件视为一种基础设施与服务 (2)网络无所不在,网络可以看成是一个软件服务的聚合体,是一个超级大& ...
 - 使用XFire+Spring构建Web Service(一)——helloWorld篇
		
转自:http://www.blogjava.net/amigoxie/archive/2007/09/26/148207.html原文出处:http://tech.it168.com/j/2007- ...
 - 使用XFire+Spring构建Web Service
		
XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用. 相 对于Axis来说,目 ...
 - Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)
		
在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...
 
随机推荐
- 理解SVG坐标系统和变换: 建立新视窗
			
在SVG绘制的任何一个时刻,你可以通过嵌套<svg>或者使用例如<symbol>的元素来建立新的viewport和用户坐标系.在这篇文章中,我们将看一下我们如何这样做,以及这样 ...
 - Paxos算法(转)
			
Paxos算法的难理解与算法的知名度一样令人敬仰,从我个人的经历而言,难理解的原因并不是该算法高深到大家智商不够,而在于Lamport在表达该算法时过于晦涩且缺乏一个完整的应用场景.如果大师能换种思路 ...
 - 6个WordPress备份插件
			
毫无疑问,为了保证网站的数据安全,经常备份是非常有必要的,当然手动备份比较麻烦,所以很多时候我们会使用WordPress的备份插件.Jackie Hole的<6 Top WordPress Ba ...
 - proftpd的示例配置文件
			
# This is a basic ProFTPD configuration file (rename it to # 'proftpd.conf' for actual use. It estab ...
 - win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项
			
怀念一下我的win7,使用了将近5年,最近终于慢慢处于崩溃且无法修复的状态. 还是重新安装了. 原本是win7下使用wubi安装Ubuntu.重装win7后,肯定没有了Ubuntu的启动项. 具体恢复 ...
 - epoll原理解释(转)
			
转自:http://yaocoder.blog.51cto.com/2668309/888374 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. ...
 - 通过Response.Flush()实现IE下载失败的问题
			
通过Response.Flush()实现对服务端文件的下载时,会失败,不能正常弹出IE下载框,经过测试发现需要进行如下设置后即可解决. 进入 [工具]--->[Internet选项]---> ...
 - 杀死当前Excel进程
			
说明: 代码编写过程中,有时需要杀死当前Excel进程,而不影响其他Excel进程. 代码如下: 添加引用: //杀死当前进程的API引用 using System.Runtime.InteropSe ...
 - powerDesigner的初步使用
			
今天初步学习了PowerDesigner,主要学习的内容有以下几个方面: 1.powerDesigner的功能之一是建立一个数据库的关系图,这里选用的数据库是MySql,基本的建立过程是这样的: a. ...
 - EasyUI Datagrid 自定义列、Foolter及单元格编辑
			
1:自定义列,包括 Group var head1Array = []; head1Array.push({ field: 'Id', title: 'xxxx', rowspan: 2 }); he ...