2011-10-04 26 views
5

Tôi đang tạo mã và tôi muốn gửi tệp mp4 đến một thiết bị Android khác. Tôi đã đạt được để kết nối cả Android thông qua Wifi và viết từ một đơn giản cho chu kỳ từ 1-20 và thiết bị Android khác đọc và hiển thị số được gửi.Chuyển tệp giữa các thiết bị Android?

Ở đây nó là một phần thú vị của "người gửi":

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

và "nhận":

serverSocket = new ServerSocket(SERVERPORT); 

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

này hoạt động tuyệt vời! Nhưng tôi muốn gửi một tập tin từ một thiết bị khác thay vì một int. Làm thế nào tôi có thể làm được điều này ?????

Trả lời

1

Bạn cần đóng gói dữ liệu vào luồng thông qua một loại định dạng dữ liệu nào đó. Một cách để làm điều này là sử dụng định dạng dữ liệu MIME chung thường được sử dụng để gửi tệp đính kèm trong email.

Tôi đã trả lời câu hỏi khác liên quan đến việc gửi tệp nhị phân qua ổ cắm sử dụng định dạng này trong the following SO Question - android add filename to bytestream. Bạn có thể kiểm tra câu trả lời được chấp nhận cho câu hỏi đó.

Để bạn tham khảo, tôi vừa sao chép mã để gửi và nhận thông qua socket từ câu hỏi đó bên dưới.

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

Và mã để đọc lại dưới đây sử dụng MimeBodyPart là một phần của JavaMail.


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

Nice !! Vì vậy, tôi sẽ bỏ qua một phần của tên tập tin. Điều gì dành cho "multipartContent.addPart (" imageFile ", isb); " ??? Và làm cách nào tôi có thể tải tệp trong một điện thoại Android khác ?? Nguyên nhân câu trả lời mà bạn đã đặt ra là dành cho JavaMail ?? Cảm ơn !! – Merol

+0

JavaMail chỉ được sử dụng vì nó chứa thư viện cho định dạng MIME (MimeMultipart), nhưng nó không có gì để làm với thư. Tên tệp về cơ bản là siêu dữ liệu cho tên tệp mà bạn chuyển sang phía bên kia (nếu nó không quan trọng, bạn có thể đặt bất kỳ thứ gì) và "imageFile" chỉ là chìa khóa cho dữ liệu, bạn có thể đặt tên nó là gì. Nó chỉ ở đó như một mẫu. Tôi sử dụng cùng một mẫu nếu tôi cần chuyển nhị phân trong các dự án của mình vì điều này được chứng minh là hoạt động trong tệp đính kèm email. Việc tạo định dạng dữ liệu của riêng tôi dễ dàng hơn – momo

0

Có một dự án mã nguồn mở phát hành bởi Google bạn có thể có một cái nhìn vào nó và có một ý tưởng chung về kết nối các thiết bị và chia sẻ tập tin giữa chúng.

Đây là liên kết: android-fileshare

Các vấn đề liên quan