有人可以帮我解决这个问题吗?我正在尝试使用 android 上的 ksoap 将 base64 字符串格式的图像上传到 .Net Web 服务(Web 服务器)。当我单击 android 应用程序上的提交按钮时,我能够成功上传文件,但它冻结并停止响应。我到处寻找解决方案,我找不到任何东西。大多数使用 Post 方法到 PHP 服务器的解决方案。请帮忙!提前致谢。
这是我的代码;
btnSubmit.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
//save image to path///////////////////
try{
String ImageData = lblEncodedImage.getText().toString();
imagefile = lblTargetUri.getText().toString();
//webservice class for android.
WebServiceCaller DWSCaller = new WebServiceCaller();
int uploadResult = DWSCaller.UploadFile(ImageData, imagefile);
if(uploadResult == 1){
//do something
lblStatus.setText("Submitted!");
}
else
{
lblStatus.setText("Error Submitting");
}
}
catch(Exception e) {
e.printStackTrace();
lblStatus.setText("Error Submitting" + e.getMessage());
}
////////////////////////////////////////
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
try {
Uri targetUri = data.getData();
//txtTargetUri.setText(targetUri.toString());
String fileName = getRealPathFromURI(targetUri);
File aFile = new File(fileName);
///////////////////////
lblTargetUri.setText(aFile.getName());
lblImagePath.setText(fileName);
Bitmap bitmap;
//bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
//Or use decodefile method
bitmap = BitmapFactory.decodeFile(fileName);
targetImage.setImageBitmap(bitmap);
//base 64 conversion
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] byteArray = baos.toByteArray();
//Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
//targetImage.setImageBitmap(bm);
encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
lblEncodedImage.setText(encodedImage);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
我还创建了一个名为 WebServiceCaller 的不同类,这里是代码;
public class WebServiceCaller {
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://10.0.2.2:63097/service.asmx?WSDL";
public int UploadFile(String imageData, String filename){
int result = 0;
final String SOAP_ACTION = "http://tempuri.org/CreateFileFromBase64String";
final String METHOD_NAME = "CreateFileFromBase64String";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo propInfo1 =new PropertyInfo();
propInfo1.setName("_imageData");
propInfo1.setValue(imageData);
propInfo1.setType(String.class);
request.addProperty(propInfo1);
PropertyInfo propInfo2 =new PropertyInfo();
propInfo2.setName("_filename");
propInfo2.setValue(filename);
propInfo2.setType(String.class);
request.addProperty(propInfo2);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; // put this only if the web service is .NET one
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Log.i("myApp", response.toString());
if(response.toString().equalsIgnoreCase("true")){
result = 1;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
这是我的 .Net 网络服务的网络方法
[WebMethod]
public bool CreateFileFromBase64String(string _imageData, string _filename)
{
try
{
string path = @"C:\inetpub\wwwroot\web\";
MemoryStream msf = new MemoryStream(Convert.FromBase64String(_imageData));
Stream stem = new FileStream(path + _filename, FileMode.Create);
msf.WriteTo(stem);
msf.Flush();
msf.Close();
stem.Close();
return true;
}
catch { return false; }
}
我的清单中有这个。当我更改 SDKVersion 时,它会停止保存文件并仍然冻结。任何建议。
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
日志猫:
06-29 16:08:48.522: D/dalvikvm(8660): threadid=1: 撤消后仍然挂起 (sc=1 dc=1) 06-29 16:10:26.225: D/AndroidRuntime(8660): 关闭VM 06-29 16:10:26.225: W/dalvikvm(8660): threadid=1: 线程以未捕获的异常退出 (group=0x409c01f8) 06-29 16:10:26.292: E/AndroidRuntime(8660): 致命异常:主要 06-29 16:10:26.292: E/AndroidRuntime(8660): java.lang.NullPointerException 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 com.micsoftwares.iltc.GalleryRegister$UploadTask.onPostExecute (GalleryRegister.java:51) 06-29 16:10:26.292: E/AndroidRuntime(8660): at com.micsoftwares.iltc.GalleryRegister$UploadTask.onPostExecute(GalleryRegister.java:1) 06-29 16:10:26.292 : E/AndroidRuntime(8660): 在 android.os.AsyncTask.finish(AsyncTask.java:602) 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 android.os.AsyncTask。访问$600(AsyncTask.java:156) 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 06-29 16:10:26.292 : E/AndroidRuntime(8660): 在 android.os.Handler.dispatchMessage(Handler.java:99) 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 android.os.Looper.loop(Looper. java:137) 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 android.app.ActivityThread.main(ActivityThread.java:4424) 06-29 16:10:26.292: E/AndroidRuntime(8660) : 在 java.lang.reflect.Method.invokeNative(Native Method) 06-29 16:10:26.292: E/AndroidRuntime(8660): 在 java.lang.reflect.Method.invoke(Method.java:511) 06- 29 16:10:26.292: E/AndroidRuntime(8660): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 06-29 16:10:26.292: E/AndroidRuntime(8660) : 在 com.android。internal.os.ZygoteInit.main(ZygoteInit.java:551) 06-29 16:10:26.292: E/AndroidRuntime(8660): at dalvik.system.NativeStart.main(Native Method)