2013-04-12 7 views
8

Ciao Il mio obiettivo finale è quello di trasferire i file utilizzando api diretta wifi in Android tra i due dispositivi. Una volta che il dispositivo funge da client, un altro funge da server come nella demo sdk diretta wifi. Per questo, creare un socket dal lato client usando la porta del server e l'indirizzo dell'host. Voglio trasferire più file. Nel lato ricevente mentre accetto la connessione socket client, devo creare il file con il nome file del file inviato dal lato client. Ma non conosco quel nome di file dal lato server.Come trovare il nome del file di un file che viene trasferito tramite la modalità wifi diretta in Android?

Così come inviare nome del file utilizzando connessione socket per questa modalità trasferimento diretto WiFi per il trasferimento di file multipli.

Creazione presa dal lato client utilizzando la porta del server e l'indirizzo host:

fileUris = intent.getExtras().getParcelableArrayList(EXTRA_STREAM); 
     String host = intent.getExtras().getString(
       EXTRAS_GROUP_OWNER_ADDRESS); 
     Socket socket = new Socket(); 
     int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT); 

     try { 
      Log.d(WifiDirectActivity.TAG, "Opening client socket - "); 
      socket.bind(null); 
      socket.connect((new InetSocketAddress(host, port)), 
        SOCKET_TIMEOUT); 

      Log.d(WifiDirectActivity.TAG, 
        "Client socket - " + socket.isConnected()); 
      OutputStream stream = socket.getOutputStream(); 
      ContentResolver cr = context.getContentResolver(); 
      InputStream is = null; 
      for (int i = 0; i < fileUris.size(); i++) { 
       Uri uri = fileUris.get(0); 

       try { 
        is = cr.openInputStream(Uri.parse(uri.toString())); 
       } catch (FileNotFoundException e) { 
        Log.d(WifiDirectActivity.TAG, e.toString()); 
       } 
       DeviceDetailFragment.copyFile(is, stream); 
       Log.d(WifiDirectActivity.TAG, "Client: Data written"); 
      } 

Accettare client presa lato server modulo di connessione:

ServerSocket serverSocket = new ServerSocket(8988); 
      Log.d(WifiDirectActivity.TAG, "Server: Socket opened"); 
      Socket client = serverSocket.accept(); 

      Log.d(WifiDirectActivity.TAG, 
        "Server: connection done with client"); 

      final File f = new File(
        Environment.getExternalStorageDirectory() + "/" 
          + context.getPackageName() + "/wifip2pshared-" 
          + "sample"); 
      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(); 

davvero colpito a dare il nome del file in lato ricevitore alla creazione del file. C'è un modo per inviare il nome del file insieme a quello. per favore aiutami su questo. Grazie in anticipo.

+0

Se il mio modo di fare non soddisfa le tue necessità, gentilmente segnalarlo come la risposta accettata, in modo che possa essere un riferimento per gli altri pure. Grazie. – Sebastiano

risposta

2

è possibile creare un oggetto di pacchetto che incorpora sia il nome del file e i dati effettivi. Qualcosa di simile a questo:

public class WiFiDirectBundle extends Serializable { 
     private String fileName; 
     private String mimeType; 
     private Long fileSize; 
     private byte[] fileContent; 

     public WiFiDirectBundle() {} 

     // adds a file to the bundle, given its URI 
     public void setFile(Uri uri) { 
      File f = new File(Uri.parse(uri.toString())); 

      fileName = f.getName(); 
      mimeType = MimeTypeMap.getFileExtensionFromUrl(f.getAbsolutePath()); 
      fileSize = f.length(); 

      FileInputStream fin = new FileInputStream(f);   
      fileContent = new byte[(int) f.length()]; 
      fin.read(fileContent); 
     } 

     // restores the file of the bundle, given its directory (change to whatever 
     // fits you better) 
     public String restoreFile(String baseDir) { 
      File f = new File(baseDir + "/" + fileName); 
      try { 
       FileOutputStream fos = new FileOutputStream(f); 
       if (fileContent != null) { 
        fos.write(fileContent); 
       } 

       fos.close(); 
       return f.getAbsolutePath(); 

      } catch (IOException e) { 
        e.printStackTrace(); 
      } 

      return null; 
     } 

     public String getFileName() { 
      return fileName; 
     } 

     public String getMimeType() { 
      return mimeType; 
     } 

     public Long getFileSize() { 
      return fileSize; 
     } 
    } 

Poi, si può passare un'istanza di un WiFiDirectBundle avanti e indietro, semplicemente utilizzando i flussi di input e output. Quando si riceve un oggetto, è necessario farlo espressamente nella classe WiFiDirectBundle.

io so che non è elegante, ma funziona realmente.

Problemi correlati