在Android设备之间传输文件?

问题描述:

我正在做一个代码,我想发送一个mp4文件到另一个Android设备。我已经通过Wifi连接两个Android,并从一个简单的1-20周期写入,另一个Android设备读取并显示发送的号码。在Android设备之间传输文件?

这是 “发件人” 的有趣的部分:

   InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       Socket socket = new Socket(serverAddr, port); 
       connected = true; 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 


         for (int i = 1; i < 20; i++) { 


          out.println(i); 

          i=i++; 

和 “接收器”:

serverSocket = new ServerSocket(SERVERPORT); 

         // listen for incoming clients 
         Socket client = serverSocket.accept(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()),8*1024); 

这个伟大的工程!但我想从一个设备发送文件到另一个而不是一个int。我该如何做到这一点?

您需要通过某种数据格式将数据打包到流中。一种方法是使用通常用于在电子邮件中发送附件的通用MIME数据格式。

我已经回答了在the following SO Question - android add filename to bytestream中使用此格式通过套接字发送二进制文件的其他相关问题。您可以查看该问题的接受答案。

为了供您参考,我刚刚从以下问题中复制了通过套接字发送和接收的代码。

File f = new File(path); 
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 
String filename=path.substring(path.lastIndexOf("/")+1); 

// create a multipart message 
MultipartEntity multipartContent = new MultipartEntity(); 

// send the file inputstream as data 
InputStreamBody isb = new InputStreamBody(new FileInputStream(f), "image/jpeg", filename); 

// add key value pair. The key "imageFile" is arbitrary 
multipartContent.addPart("imageFile", isb); 

multipartContent.writeTo(out); 
out.flush(); 
out.close(); 

并且使用属于JavaMail的MimeBodyPart来回读以下代码。


MimeMultipart multiPartMessage = new MimeMultipart(new DataSource() { 
    @Override 
    public String getContentType() { 
     // this could be anything need be, this is just my test case and illustration 
     return "image/jpeg"; 
    } 

    @Override 
    public InputStream getInputStream() throws IOException { 
     // socket is the socket that you get from Socket.accept() 
     BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream()); 
     return inputStream; 
    } 

    @Override 
    public String getName() { 
     return "socketDataSource"; 
    } 

    @Override 
    public OutputStream getOutputStream() throws IOException { 
     return socket.getOutputStream(); 
    } 
}); 

// get the first body of the multipart message 
BodyPart bodyPart = multiPartMessage.getBodyPart(0); 

// get the filename back from the message 
String filename = bodyPart.getFileName(); 

// get the inputstream back 
InputStream bodyInputStream = bodyPart.getInputStream(); 

// do what you need to do here.... 
+0

不错!所以我会忽略文件名的一部分。 什么是“multipartContent.addPart(”imageFile“,isb); ”??? 而我怎样才能得到另一个Android手机中的文件?因为你指定的答案是为JavaMail? 谢谢! – Merol

+0

由于JavaMail包含MIME格式的库(MimeMultipart),因此只使用JavaMail,但它与邮件无关。文件名基本上是您传输到另一端的文件名的元数据(如果没关系,您可以放入任何内容),“imageFile”只是数据的关键字,您可以将其命名为任何内容。这只是作为一个样本。如果我需要在我的项目中传输二进制文件,我使用相同的模式,因为这证明可以在电子邮件附件中使用。这比设计我自己的数据格式更简单 – momo

有发布了一个开源项目由谷歌你可以看看它,并有关于连接设备以及它们之间共享文件的一般概念。

这里是链接:android-fileshare