2015-06-30 17 views
0

我想使用WifiDirect演示api發送錄製音頻到另一個android設備,但輸入流從套接字始終返回null。 任何幫助,非常感謝。client.getInputStream返回null

下面是代碼的一部分

protected String doInBackground(Void... params) { 
     try { 
      ServerSocket serverSocket = new ServerSocket(8988); 
      Log.d(WiFiDirectActivity.TAG, "Server: Socket opened"); 
      Socket client = serverSocket.accept(); 
      Log.d(WiFiDirectActivity.TAG, "Server: connection done"); 
      final File f = new File(Environment.getExternalStorageDirectory(), File.separator + "SuDAB/received/" 
        + "sudab-" + System.currentTimeMillis() 
        + ".3gp"); 

      File dirs = new File(f.getParent()); 
      if (!dirs.exists()) { 
       dirs.mkdirs(); 
      } 
      f.createNewFile(); 

      Log.d(WiFiDirectActivity.TAG, "server: copying files " + f.toString()); 
      InputStream inputstream = client.getInputStream(); 

      copyFile(inputstream, new FileOutputStream(f)); 
      serverSocket.close(); 
      return f.getAbsolutePath(); 
     } catch (IOException e) { 
      Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
      return null; 
     } 
    } 

public static boolean copyFile(InputStream inputStream, OutputStream out) { 
    byte buf[] = new byte[1024]; 
    int len; 
    long startTime = System.currentTimeMillis(); 
    if (inputStream == null) { 
     return false; 
    } 
    try { 
     while ((len = inputStream.read(buf)) != -1) { 
      out.write(buf, 0, len); 
     } 
     out.close(); 
     inputStream.close(); 
     long endTime = System.currentTimeMillis() - startTime; 
     Log.v(WiFiDirectActivity.TAG, "Time taken to transfer all bytes is : " + endTime); 

    } catch (IOException e) { 
     Log.d(WiFiDirectActivity.TAG, e.toString()); 
     return false; 
    } 
    return true; 
} 

這是我的傳遞文件被髮送到FileTransferService

mContentView.findViewById(R.id.btn_start_client).setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // Allow user to pick an image from Gallery or other 
        // registered apps 
        TextView statusText = (TextView) mContentView.findViewById(R.id.status_text); 
        statusText.setText("Sending: " + lastFile); 
        Log.d(WiFiDirectActivity.TAG, "Intent----------- " + lastFile); 
        Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
        Log.d(WiFiDirectActivity.TAG, "File transfer service created..."); 
        serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
        serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, lastFile); 
        serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 
          info.groupOwnerAddress.getHostAddress()); 
        serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 
        getActivity().startService(serviceIntent); 
       } 
      }); 
+0

'這是我如何通過文件發送到FileTransferService'。不,你只能通過一個文件名。沒意思。您最好過帳發送文件內容的代碼。 – greenapps

+0

@greenapps請你澄清一點,因爲我不確定我是否理解。我通過文件名稱好吧。這是因爲putExtra在那裏接受字符串參數。請通過發送文件的內容讓我知道你的意思。謝謝。 –

+0

我後來發現我在做錯了之後發現在調試時發現FileNotFoundException被拋出。 lastFile應該已經以file://開頭。謝謝@greenapps –

回答

0
serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, lastFile); 

serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, "file://"+lastFile); 

改爲。