Передача файла между устройствами Android? - PullRequest
5 голосов
/ 04 октября 2011

Я делаю код и хочу отправить файл mp4 на другое устройство Android. Мне удалось подключить оба Android-устройства через Wi-Fi и записать с одного простого цикла от 1 до 20, а другое устройство 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. Как я могу сделать это ?????

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Вам необходимо упаковать данные в поток через какой-то формат данных.Один из способов сделать это - использовать общий формат данных MIME, который обычно используется для отправки вложений по электронной почте.

Я ответил на другой вопрос, связанный с отправкой двоичного файла через сокет с использованием этого формата, в в следующем SOВопрос - Android добавить имя файла к 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();

И код для чтенияобратно, используя MimeBodyPart , который является частью 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 голосов
/ 04 марта 2012

Существует проект с открытым исходным кодом , выпущенный Google , вы можете взглянуть на него и получить общее представление о подключении устройств и обмене файлами между ними.

Вот ссылка: android-fileshare

...