web-dev-qa-db-fra.com

Client-Serveur: Transfert de fichiers d'Android vers un PC connecté via un socket

J'essaie d'envoyer une photo de ma galerie choisie dans la galerie de mon téléphone et de l'envoyer à mon PC. Lorsque je clique sur le bouton, il faut prendre le chemin de la photo, la mettre dans un fichier et la transférer. sur mon PC. J'ai vérifié le code sur mon PC - des deux côtés - et tout fonctionnait parfaitement.

Quand je le teste, rien ne se passe!

Voici le code:

Du côté serveur:

    import Java.io.*;
import Java.net.*;

public class FileServer {

    public static void main(String[] args) throws IOException {
        int filesize=6022386; // filesize temporary hardcoded

        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;

        // create socket
        ServerSocket servsock = new ServerSocket(1149);
        while (true) {
          System.out.println("Waiting...");

          Socket sock = servsock.accept();
          System.out.println("Accepted connection : " + sock);

       // receive file
            byte [] mybytearray  = new byte [filesize];
            InputStream is = sock.getInputStream();
            FileOutputStream fos = new FileOutputStream("C:\\Users\\Arwa\\Documents\\WebOffice.jpg"); // destination path and name of file
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            bytesRead = is.read(mybytearray,0,mybytearray.length);
            current = bytesRead;

            // thanks to A. Cádiz for the bug fix
            do {
               bytesRead =
                  is.read(mybytearray, current, (mybytearray.length-current));
               if(bytesRead >= 0) current += bytesRead;
            } while(bytesRead > -1);

            bos.write(mybytearray, 0 , current);
            bos.flush();
            long end = System.currentTimeMillis();
            System.out.println(end-start);
            bos.close();



          sock.close();
          }
    }

}

Côté client (Android):

 package com.arwa.file.send;

import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.ObjectOutputStream;
import Java.io.OutputStream;
import Java.net.Socket;
import Java.net.UnknownHostException;

import Android.app.Activity;
import Android.content.Intent;
import Android.database.Cursor;
import Android.net.Uri;
import Android.os.Bundle;
import Android.provider.MediaStore;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.ImageView;
import Android.widget.TextView;

public class SendfileActivity extends Activity {
    /** Called when the activity is first created. */

    private static final int SELECT_PICTURE = 1;

    private String selectedImagePath;
    private ImageView img;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("34");
        img = (ImageView) findViewById(R.id.ivPic);
        System.out.println("36");
        ((Button) findViewById(R.id.bBrowse))
                .setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) {
                        System.out.println("40");
                        Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(
                                Intent.createChooser(intent, "Select Picture"),
                                SELECT_PICTURE);
                        System.out.println("47");
                    }
                });
        ;
        System.out.println("51");
        Button send = (Button) findViewById(R.id.bSend);
        final TextView status = (TextView) findViewById(R.id.tvStatus);

        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Socket sock;
                try {
                    sock = new Socket("MY_PCs_IP", 1149); 
                    System.out.println("Connecting...");

                     // sendfile
                          File myFile = new File (selectedImagePath); 
                          byte [] mybytearray  = new byte [(int)myFile.length()];
                          FileInputStream fis = new FileInputStream(myFile);
                          BufferedInputStream bis = new BufferedInputStream(fis);
                          bis.read(mybytearray,0,mybytearray.length);
                          OutputStream os = sock.getOutputStream();
                          System.out.println("Sending...");
                          os.write(mybytearray,0,mybytearray.length);
                          os.flush();

                        sock.close();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                TextView path = (TextView) findViewById(R.id.tvPath);
                path.setText("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
            }
        }
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
}

Code XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/tvStatus"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/hello" />

    <TextView
        Android:id="@+id/tvPath"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Path: " />

    <Button
        Android:id="@+id/bBrowse"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Browse" >
    </Button>

    <Button
        Android:id="@+id/bSend"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Send" />

    <ImageView
        Android:id="@+id/ivPic"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" >
    </ImageView>

</LinearLayout>
15
Arwa A

il vous suffit d'ajouter l'autorisation

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>

et cela fonctionnera parfaitement.

2
Alaa

Au lieu de l’essayer dans l’émulateur sur PC, essayez d’exécuter la même chose sur un appareil mobile. Aussi, j'ai changé le numéro de port à 8000 au lieu d'utiliser le port 1149.

Avec ces changements, le code a bien fonctionné pour moi. Vérifiez s'il vous plaît.

1
Narendra Rathore

Il ne fonctionne pas parce que vous n’avez pas réintialisé votre variable actuelle à 0 Il semble que vous soyez en train de s’ajouter dans la boucle suivante sans remettre à zéro la valeur. Donc, à mon avis, cela pourrait causer un problème lors de la deuxième itération de votre exécution.

0
adnaan.zohran