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