2011-10-04 9 views
5

コードを作成していて、別のAndroidデバイスにmp4ファイルを送信したいとします。私はWifi経由で両方のアンドロイドを接続し、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の代わりにあるデバイスから別のデバイスにファイルを送りたいと思っています。どうすればこのことができますか?

答えて

1

データをある種のデータ形式でストリームにパッケージ化する必要があります。これを行う1つの方法は、電子メールで添付ファイルを送信するために一般的に使用される共通の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)用のライブラリを含んでいるので使用されますが、メールとは関係ありません。ファイル名は、基本的に相手側に転送するファイル名のメタデータです(問題がなければ何も置くことはできません)。また、「imageFile」はデータのキーに過ぎません。サンプルとしてしかそこにはありませんでした。これは電子メールの添付ファイルで動作することが証明されているので私は私のプロジェクトでバイナリを転送する必要がある場合私は同じパターンを使用します。自分のデータフォーマットを考案するよりも簡単です – momo

0

あなたはそれを見て、デバイスを接続し、それらの間でファイルを共有することについての一般的な考えを持つことができるGoogleのが発表したオープンソースプロジェクトがあります。

リンク先は次のとおりです。android-fileshare

関連する問題