3

AndroidデバイスからJavaアプリケーションにバイト配列を送信する必要があります。Androidでそのためにksoap2を使用しており、そのバイト配列を受信して​​さらに処理するためにサーバーでファイルを作成するために、axis2を使用してJavaでWebサービスを作成しました。

完全な説明をさせてください。私はAndroidデバイスでWaveファイルを記録しており、そのWaveファイルはサーバー上にあるJavaアプリケーションで送信する必要があります。着信バイト配列を再びウェーブファイルに変換してサーバーに保存します。Androidデバイスから、ウェーブファイルをバイト配列として送信し、get_wave_byte()の引数にストレージパスも送信します。

そのために、AndroidでWaveファイルを作成し、その後、そのWaveファイルをバイト配列に変換する1つのメソッドを作成しました。Waveファイルをバイト配列に変換する方法は次のとおりです...

public static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);

        // Get the size of the file
        long length = file.length();

        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }

        // Close the input stream and return bytes
        is.close();
        return bytes;
    }

だから基本的に今私はそれらのバイト配列を次のコードでJavaアプリケーションに送信しています...

 File source_for_byte=new File(outFilename);//Here is my wave file 

//そのファイルをバイト配列に格納するための一時的なバイト配列を作成します

 byte[] temp = new byte[(int) source_for_byte.length()];

//次に、ファイルをバイト配列に変換する上記のようにメソッドを呼び出します

temp=getBytesFromFile(source_for_byte);

ここから、ksoap2を使用してjavaアプリケーションメソッドを呼び出します。このメソッドでは、配列バイトを引数として、文字列をファイルパスとして呼び出し、get_wav_byte()メソッドを使用してサーバーに格納します。

 String NAMESPACE = "http://test.com";
                String SOAP_ACTION = NAMESPACE + METHOD_NAME;
                // NAMESPACE + method name
                final String URL = "http://192.168.3.106:8080/axis2/services/speechmain?wsdl";

                    METHOD_NAME = "get_wav_byte";
                    try {
                        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                        request.addProperty("wavbite",temp);

                        request.addProperty("path", "D:\\sound\\latest_recognizer.wav");
                        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                                SoapEnvelope.VER11);
                        envelope.dotNet = true;
                        envelope.setOutputSoapObject(request);
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                        androidHttpTransport.call(SOAP_ACTION, envelope);
                        Object result = envelope.getResponse();
                        ((TextView) findViewById(R.id.gettext1)).setText("NUMBER IS :->   "
                                 + result.toString());

                    } catch (Exception E) {
                        E.printStackTrace();
                        ((TextView) findViewById(R.id.gettext1)).setText("ERROR:"
                                + E.getClass().getName() + ":" + E.getMessage());
                    }

そして私のjavaアプリケーションメソッドは私がアンドロイドから呼び出すことは次のとおりです...

 public int get_wav_byte(byte[] wavbite,String path){

        try
            {
                File dstFile = new File(path);
                FileOutputStream out = new FileOutputStream(dstFile);
                    out.write(wavbite, 0, wavbite.length);
                out.close();               
            }
            catch (IOException e)
            {
              System.out.println("IOException : " + e);
            }

         return 0;
         }

私の問題は、Androidアプリケーションを実行してこのWebサービスを呼び出すと、次のエラーが発生することです。

 java.lang.runtimeexception:cannot serialize:[B@40781280]

もう1つ、次のコードを使用して、同じJavaメソッドを.netアプリケーションから呼び出していることを伝えたいと思います。

static void Main(string[] args)
        {
            byte[] byteArrayFile = File.ReadAllBytes("D:/Projects/ConsoleApplication1/ConsoleApplication1/1347452692320.wav");

            String mypath="D:\\sound\\bhavik_latest_copy_recorded.wav";


            short[] shortwave=ConvertBytesToShorts(byteArrayFile);
          Speech_service.speechmainPortTypeClient obj = new Speech_service.speechmainPortTypeClient();

            obj.get_wav_byte(byteArrayFile,mypath);
}

そして、単にチャンプのように機能し、私のウェーブファイルを簡単に保存します

それで、それがエラーを与えるという私のアンドロイドコードの問題は何ですか。

何が悪いのか教えてもらえますか?

前もって感謝します。

4

2 に答える 2

16

わかりました。エラーを解決しました。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);

            new MarshalBase64().register(envelope); // serialization
于 2012-09-13T09:48:32.080 に答える
0
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

    new MarshalBase64().register(envelope);   // this is will over Cannot serialize: [B@f034108 

    envelope.dotNet = true;
    //Set output SOAP object
    envelope.setOutputSoapObject(request);
    //Create HTTP call object
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAPACTION, envelope);
        SoapObject response = (SoapObject) envelope.getResponse();
于 2018-07-20T19:22:00.453 に答える