关于BSLC的工作总结android+webservice.docx

上传人:b****3 文档编号:5073086 上传时间:2022-12-13 格式:DOCX 页数:24 大小:28.43KB
下载 相关 举报
关于BSLC的工作总结android+webservice.docx_第1页
第1页 / 共24页
关于BSLC的工作总结android+webservice.docx_第2页
第2页 / 共24页
关于BSLC的工作总结android+webservice.docx_第3页
第3页 / 共24页
关于BSLC的工作总结android+webservice.docx_第4页
第4页 / 共24页
关于BSLC的工作总结android+webservice.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

关于BSLC的工作总结android+webservice.docx

《关于BSLC的工作总结android+webservice.docx》由会员分享,可在线阅读,更多相关《关于BSLC的工作总结android+webservice.docx(24页珍藏版)》请在冰豆网上搜索。

关于BSLC的工作总结android+webservice.docx

关于BSLC的工作总结android+webservice

写在前面:

这篇是我暑假以及开学之后的一段时间里,在开发BSLC(同城物物交换系统)的工作总结。

因为我也是个android的初学者,所以遇到的很多问题估计也是android初学者可能会遇到的问题。

当然,如果你是个android高手,那么此文估计对你的帮助不大。

另外,有很多朋友和老师问我,你做的这个东西亮点在哪里呢?

凭什么得奖呢?

我想说,谁不想做出有新意的东东呢?

可是对于从零开始的我们,仅仅靠着模仿前人的东西,就已经是要了老命了。

哈哈。

好吧,说这话确实有点不上进。

给准备或者刚开始学习android的朋友的一点小建议:

有可能的话,跟这有实际开发经验(这个经验不只是指android开发的能力经验,还有正规开发软件的规范和过程的经验)的前辈,会让你更快更好更轻松的前进!

!

!

(当然这里的轻松也是相对而言的轻松,学习之事,即使有兴趣做动力,也多半是痛苦之事,所以,强大的心理是必要的,要学会苦中作乐,认真负责,团队合作,不耻下问……)

好了,话不多说,下面是我整理出来的技术总结:

有对内容的疑问或者质疑,欢迎大家与我交流。

企鹅号:

947840486

Android与webservice开发技术总结(eclipse&visualstudio2008)

虽然开始得有点晚,但总也好过一直不开始。

从今天起,开始整理自己在android——webservice开发过程中遇到的各种问题,以及解决的过程。

真心觉得有必要做个每日总结,为了纪念也好,为了以后用到的时候方便查看也好(估计希望不大),总之,专业的程序员都会写技术总结。

这几天一直在整图片上传下载的问题。

从最初的不知所措,到现在的略有了解,个人理解的原理是,通过把图片转换成base64编码,存放在字节流中,通过对字节流的读取、存放,来实现最终对图片的操作。

难点是,如何在android下和C#的webservice中分别实现,以及数据的交互。

最初找了很多资料来看,开始选择的是ksoap2+base64

遇到的细节问题:

图片路径:

/sdcard/###.pngandroidapp只能读取模拟器上的文件(图片),而且不能在系统文件里读取图片(root权限问题),所以,最后还是把测试的图片放到了/sdcard下。

最初想先用.net发布web服务的调试功能,手动传图片。

可是后来在学长的提醒下,明白其实不是直接传路径,(而且转换后的字节流),所以,基本上没法手动调试。

Ksoap2不支持传递byte[]类型的参数,后来试着传base64编码后的string类型,在web服务端再解码,但是不知道哪里出错,还是产生异常。

唉,难道要换别的方法?

已解决,问题还是出在了服务端。

是文件最后的存储路径不对,不能写绝对路径(估计是我的格式不对),改成(~/XXX/)相对路径就OK了!

只是这是一个简单的demo,只能上传单个的固定的文件。

不过,可以比较容易改进,难点是最终我们的项目要求是一次返回多组图片数据,有待完善。

8月17日

图片上传整合到BSLC中:

进展比较缓慢。

第一个对调用系统相册的解决过程。

查了很多资料,最后还是找到一个比较详细的,通过Intent.createChooser,可以选择调用多个Activity。

难点是,需要在这多个被调用的Activity在AndroidManifest注册的时候加上intent-filter,貌似这里是用来区分那些是属于Intent.ACTION_GET_CONTENT类型里的。

这样的话,也就不再是调用系统默认的INTENT了吧。

android:

name="com.photos.doTakePhoto"

android:

label="照相">

name="android.intent.action.GET_CONTENT"/>

name="android.intent.category.DEFAULT"/>

Intent.createChooser的相关代码:

publicclassImageButtonClicklistenerimplementsOnClickListener

{

intresultCode;//区分照相还是从本地获取图片

publicvoidonClick(Viewv)

{

IntentgetAlbum=newIntent(Intent.ACTION_GET_CONTENT);

IntentselectIntent=newIntent(Intent.createChooser(getAlbum,"选择图片"));

Add01.this.startActivity(selectIntent);

}

}

今天的第二个坑爹的问题是:

不知道什么原因,在往sdcard里添加图片的时候报错权限问题:

read-onlysystem(后缀的permission变成了d------),实际应该是d---rwxr。

各种google各种研究各种方法试都没有效果,重启了两次,删了又建了好几次模拟器。

(还试过edit过sdcard路径为file镜像文件sdcard.img)

最后一怒之下,把系统在User/pss(我的主机名)目录下的.Android文件夹全部删除。

然后关机,去吃饭了。

等再回来,新建了一个AVD(模拟器),惊喜地发现,sdcard权限问题解决了。

 

最后再列出一个之前遇到过的各种问题,可能有些记不清了,等有机会再补充解决过程吧。

@ksoap2的Action不能被webservice(vs2008.netC#)识别。

这个有过痛苦的回忆,所以做过记录。

//在Java平台上调用.NETWebService的服务时,出现"服务器未能识别HTTP标头SOAPAction的值"

//SOAPActionHTTPrequestheader被用来标识SOAPHTTP请求的目的地,其值是个URI地址

//SOAP发送并不限制格式、URI特征或其必须可解析,那么在这种情况下,发送一个HTTPSOAP请求时,其HTTP客户端必须使用/指明SOAPActionHTTPrequestheader

//SOAPActionheader的内容可以被用在服务端,诸如:

防火墙适当的过滤基于HTTP的SOAP请求消息等场景。

//SOAPActionheader的值为空串("")表示SOAP消息的目的地由HTTP请求的URI标识;无值则表示没有指定这条消息的目的地

[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

@类似的还有:

SoapObject类型不能正确接受webservice返回的值,改用Object类型,再转化回SoapObject。

(或者直接用object类型)异常解决。

result=(Object)envelope.getResponse();

@webservice返回值为Dataset时,对数据的解析,也是一个痛苦的过程:

最后还是找到了一个比较有自主研究精神以及分享精神的博主,才完满解决(这里有嵌套之意):

edt2.setText(((SoapObject)((SoapObject)result).getProperty(0)).getProperty("name").toString());

ps:

man.setChecked(true);是使radiobutton(单选按钮)获取焦点的方法,也花费了很多时间,最后还是高帅学长一句话,世界安静了。

@还有一些小问题,比如数据库的外键依赖啊,sql语句的组装啊,等等,看似小问题却也花费了不少时间精力。

最后总结一句吧:

只要会耐心调试,总能找到问题的所在,然后研究解决问题。

(怕就怕在不知道异常在哪,那才是真正的坑爹了~~~~~)

2012年8月18号

今天受困于一个上传图片遗留下来的坑爹问题,本来是想半天或者一会功夫就能解决的,结果却浪费了大量的精力和好心情。

不牢骚了。

昨天做好了从本地的相册里读取图片,以期实现上传,还差的最后一步就是把读取图片的路径找到,发给文件流、字符流等等。

就是这坑爹的路径问题:

在Android里,文件的路径有两种,一种是绝对路径:

/sdcard/XX.png之类。

一种是相对路径,也就是Android系统数据库中的路径:

例如图片的uri(content:

//media/external/images/media/4)。

这里我要做的就是要把uri转换为sdcard里的绝对路径!

!

!

!

即使明白了原理和目标,也比较顺利地找到了部分相关的源代码,事实证明,源代码给的还是不全,让我们这些初学者苦不堪言啊。

捣鼓了半天,研究了半天,还是一个劲地报错:

java.lang.NullPointerException

atandroid.content.ContextWrapper.getContentResolver(ContextWrapper.java:

90)

也知道出错的位置:

Cursoractualimagecursor=this.ctx.managedQuery(uri,proj,null,null,null); 

我写的是this.managedQuery(uri,proj,null,null,null);

开始就不是很明白怎么个转换具体过程的我,在学长也没研究过的阴影下,坚持各种搜索资料,慢慢得开始有了一点感性的认识,知道问题可能出在context上(因为涉及了不少Activity)。

(上下文)最后还是用了session(自己写的一个用于静态存储数据的类),

packagecom.flogin;

importandroid.content.Context;

import.Uri;

publicclassSession

{

publicstaticStringid;//记录登录用户名

publicstaticStringpassword;//记录登录密码

publicstaticUriimageUri;

//记录最近一次上传的图片的Uri(格式:

content:

//media/external/images/media/6)

publicstaticContextdoSelectImageContext;

}

相关代码:

publicclassImageButtonClicklistenerimplementsOnClickListener

{//上传图片按钮的监听器,在add.java里

publicvoidonClick(Viewv)

{

imageButton.setVisibility(View.INVISIBLE);//隐藏button按钮

IntentgetAlbum=newIntent(Intent.ACTION_GET_CONTENT);

IntentselectIntent=newIntent(Intent.createChooser(getAlbum,"选择图片"));

Add01.this.startActivity(selectIntent);

}

}

publicbooleanupload(Uriuri,StringfileName){

//上传图片的函数service.java

try

{

Log.i("log.i","start----------------Uri:

"+uri);

Log.i("log.i","fileName:

"+fileName);

String[]proj={MediaStore.Images.Media.DATA};

Stringimg_path=getFilePathFromUri(Session.doSelectImageContext,uri,proj,null,null,null);//碉堡了,我成功了

Filefile=newFile(img_path);

Log.i("log.i","file(stringpath):

"+img_path);

FileInputStreamfis=newFileInputStream(file);//打开的图片地址

ByteArrayOutputStreambaos=newByteArrayOutputStream();

byte[]buffer=newbyte[8192];

intcount=0;

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

{

baos.write(buffer,0,count);

}

StringuploadBuffer=newString(Base64.encode(baos.toByteArray()));

Log.i("uploadbuffer","uploadbuffer:

"+uploadBuffer);

//byte[]image=baos.toByteArray();

booleanflag=connectWebService(uploadBuffer,fileName);

if(flag)

{

returntrue;

}else

{

returnfalse;

}

}catch(Exceptione)

{

e.printStackTrace();

returnfalse;

}

}

publicstaticStringgetFilePathFromUri(Contextcontext,Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)

{

Cursorcursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);

intindex=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

cursor.moveToFirst();

Stringpath=cursor.getString(index);

cursor.close();

cursor=null;

returnpath;

}

privatebooleanconnectWebService(Stringimage,StringfileName)throwsIOException,XmlPullParserException

{

StringUrl="http:

//211.87.147.81:

8082/Service.asmx";

Stringnamespace="http:

//tempuri.org/";

Stringmethodname="UploadImage";

StringSOAP_ACTION="http:

//211.87.147.81:

8082/Service.asmx?

op=UploadImage";

SoapObjectrpc=newSoapObject(namespace,methodname);

rpc.addProperty("id",Session.id);

rpc.addProperty("image",image);

rpc.addProperty("fileName",fileName);

Log.i("send:

",image+""+fileName);

HttpTransportSEht=newHttpTransportSE(Url);

ht.debug=false;

SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut=rpc;

System.out.println("post:

"+rpc);

envelope.dotNet=true;

envelope.setOutputSoapObject(rpc);

ht.call(SOAP_ACTION,envelope);

Objectresult=(Object)envelope.getResponse();

System.out.println("result:

"+result);

if(result.toString().equals("true"))

{

returntrue;

}else

{

returnfalse;

}

}

//这是出现从本地选择图片的Activity

packagecom.photos;

importjava.io.FileNotFoundException;

importcom.setting01.Add01;

importcom.flogin.Session;

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

import.Uri;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

publicclassdoSelectImageFromLoacalextendsActivity

{

/*用来标识请求照相功能的activity*/

privatestaticfinalintCAMERA_WITH_DATA=1001;

/*用来标识请求gallery的activity*/

privatestaticfinalintPHOTO_PICKED_WITH_DATA=1002;

privateBitmapbitMap;//用来保存图片

privatebooleanhasImage;//是否已经选择了图片

publicstaticUriselectedImageUri=null;

publicvoidonCreate(BundlesavedInstanceState)

{

super.onCreate(savedInstanceState);

IntentlocalIntent=newIntent();

localIntent.setType("image/*");

localIntent.setAction("android.intent.action.GET_CONTENT");

startActivityForResult(localIntent,PHOTO_PICKED_WITH_DATA);

}

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

Log.i("doSelectImageFromLoacal:

","doSelectImageFromLoacal:

start!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

!

");

if(resultCode!

=RESULT_OK)

return;

switch(requestCode){

casePHOTO_PICKED_WITH_DATA:

//从本地选择图片

if(bitMap!

=null&&!

bitMap.isRecycled()){

bitMap.recycle();

}

selectedImageUri=data.getData();

Session.doSelectImageContext=this;

Session.imageUri=selectedImageUri;//把对应图片的在数据库中的Uri读取给Session

Log.i("log.i","selectedImageUri:

"+selectedImageUri.toString());

if(selectedImageUri!

=null){

try{

bitMap=BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImageUri));

}catch(FileNotFoundExceptione){

e.printStackTrace();

}

//下面这两句是对图片按照一定的比例缩放,这样就可以完美地显示出来。

有关图片的处理将重新写文章来介绍。

//intscale=ImageThumbnail.reckonThumbnail(bitMap.getWidth(),bitMap.getHeight(),500,600);

//bitMap=ImageThumbnail.PicZoom(bitMap,(int)(bitMap.getWidth()/scale),(int)(bitMap.getHeight()/scale));

Add01.imageView.setImageBitmap(bitMap);

Add01.imageView.setVisibility(View.VISIBLE);

doSelectImageFromLoacal.this.finish();//结束当前Activity

hasImage=true;

}

break;

caseCAMERA_WITH_DATA:

//拍照

Bundlebundle=data.getExtras();

bitMap

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1