0

有人可以帮我解决这个问题吗?我正在尝试使用 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)

4

1 回答 1

0

您似乎正在主 UI 线程上上传文件。您不应该这样做,而是让自己熟悉AsyncTask(这会将繁重的工作转移到单独的线程中)。

于 2012-06-27T22:38:52.823 回答