0

誰かがこれを理解するのを手伝ってくれますか? Androidでksoapを使用して、base64文字列形式の画像を.Net Webサービス(Webサーバー)にアップロードしようとしています。Android アプリの送信ボタンをクリックすると、ファイルを正常にアップロードできましたが、フリーズして応答しなくなりました。どこでも解決策を確認しましたが、何も見つかりませんでした。PHPサーバーへのPostメソッドを使用するほとんどのソリューション。助けてください!前もって感謝します。

これが私のコードです。

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 WebサービスのWebメソッドです

 [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" />

LogCat:

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): 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.access$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): dalvik.system.NativeStart.main (ネイティブ メソッド) で

4

1 に答える 1

0

メイン UI スレッドでファイルをアップロードしているようです。それを行うべきではなく、代わりにAsyncTaskに慣れてください(重い作業を別のスレッドに移動します)。

于 2012-06-27T22:38:52.823 に答える