2013-04-12 7 views
8

Witam Naszym ostatecznym celem jest przesyłanie plików za pomocą Wi-Fi Direct API w dwóch urządzeniach. Gdy urządzenie działa jako klient, działa jak serwer, tak jak w wersji demonstracyjnej wifi direct sdk. W tym celu, Tworzenie gniazda od strony klienta za pomocą portu serwera i adresu hosta. Chcę przesłać wiele plików. Po stronie odbiorcy, akceptując połączenie z gniazdem klienta, muszę utworzyć plik z nazwą pliku, który został wysłany ze strony klienta. Ale nie znam nazwy pliku od strony serwera.Jak znaleźć nazwę pliku, który jest przesyłany w trybie bezpośrednim Wi-Fi w systemie Android?

Jak wysłać nazwę pliku za pomocą połączenia z gniazdem dla tego trybu bezpośredniego transferu w sieci WiFi w celu przesyłania wielu plików.

Tworzenie gniazdo od strony klienta za pomocą portu serwera i adres hosta:

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"); 
      } 

Akceptowanie klienta gniazdo podłączenie boczne serwera forma:

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(); 

naprawdę uderzyło w sprawie wyrażenia nazwę pliku u po stronie odbiorcy podczas tworzenia pliku. Czy istnieje sposób, aby wysłać nazwę pliku wraz z tym. Proszę, pomóżcie mi w tej sprawie. Z góry dziękuję.

+0

Jeśli mój sposób robienia tego jest odpowiedni do twoich potrzeb, uprzejmie oznacz go jako zaakceptowaną odpowiedź, tak aby mógł być także odniesieniem dla innych. Dzięki. – Sebastiano

Odpowiedz

2

Można utworzyć obiekt pakunku, który zawiera zarówno nazwę pliku, jak i rzeczywiste dane. Coś takiego:

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; 
     } 
    } 

Następnie można przejść instancję WiFiDirectBundle iz powrotem po prostu za pomocą strumieni wejściowych i wyjściowych. Po otrzymaniu obiektu musisz go jawnie rzucić na klasę WiFiDirectBundle.

Wiem, że to nie jest eleganckie, ale działa.

Powiązane problemy