2013-04-12 9 views
8

हाय मेरा अंतिम लक्ष्य दो उपकरणों के बीच एंड्रॉइड में वाईफाई सीधी एपीआई का उपयोग करके फ़ाइलों को स्थानांतरित करना है। एक बार डिवाइस क्लाइंट के रूप में कार्य करता है, तो वाईफाई सीधा एसडीके डेमो में सर्वर के रूप में कार्य करता है। इसके लिए, सर्वर पोर्ट और होस्ट पते का उपयोग करके क्लाइंट पक्ष से सॉकेट बनाना। मैं कई फाइलों को स्थानांतरित करना चाहता हूं। क्लाइंट सॉकेट कनेक्शन को स्वीकार करते समय रिसीवर पक्ष में, मुझे फ़ाइल के फ़ाइल नाम के साथ फ़ाइल बनाना होगा जो क्लाइंट साइड से भेजा गया है। लेकिन मैं सर्वर पक्ष से फ़ाइल नाम नहीं जानता।एंड्रॉइड में वाईफाई डायरेक्ट मोड के माध्यम से स्थानांतरित की जाने वाली फ़ाइल का फ़ाइल नाम कैसे ढूंढें?

तो एकाधिक फ़ाइल स्थानांतरण के लिए इस वाईफाई प्रत्यक्ष स्थानांतरण मोड के लिए सॉकेट कनेक्शन का उपयोग करके फ़ाइल नाम कैसे भेजें।

सर्वर पोर्ट और मेजबान पते का उपयोग कर ग्राहक की ओर से सॉकेट बनाना:

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

सच में फ़ाइल नाम देने पर मारा:

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

ग्राहक गर्तिका कनेक्शन प्रपत्र सर्वर साइड स्वीकारना फ़ाइल निर्माण पर रिसीवर पक्ष। इसके साथ फ़ाइल नाम भेजने का कोई तरीका है। कृपया इस पर मेरी सहायता करें। अग्रिम में धन्यवाद।

+0

यदि ऐसा करने का मेरा तरीका आपकी ज़रूरत के अनुरूप है, तो कृपया इसे स्वीकार किए गए उत्तर के रूप में ध्वजांकित करें, ताकि यह दूसरों के लिए भी संदर्भ हो। धन्यवाद। – Sebastiano

उत्तर

2

आप एक बंडल ऑब्जेक्ट बना सकते हैं जो फ़ाइल नाम और वास्तविक डेटा दोनों को एम्बेड करता है। कुछ इस तरह:

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

फिर, आप बस इनपुट और आउटपुट धाराओं का उपयोग करके एक WiFiDirectBundle आगे और पीछे का एक उदाहरण दे सकते हैं। जब आप कोई ऑब्जेक्ट प्राप्त करते हैं, तो आपको इसे WiFiDirectBundle कक्षा में स्पष्ट रूप से डालना होगा।

मुझे पता है कि यह सुरुचिपूर्ण नहीं है, लेकिन यह वास्तव में काम करता है।

संबंधित मुद्दे

 संबंधित मुद्दे