Quiero enviar una imagen de mi dispositivo Android a través de tomas de pitón, he tenido éxito en el envío de texto de Android-Python. Cuando envío la imagen consigo el brindis de la imagen que está siendo enviado, pero en el extremo receptor de la imagen está dañada con un tamaño de 0 KB Agradezco cualquier ayuda, ya que actualmente estoy atascado aquí.
Aquí está mi código
image.py
from socket import *
port = 8888
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', port))
s.listen(1) #listens to 1 connection
conn, addr = s.accept()
print("Connected by the ",addr)
while True:
data = conn.recv(1024)
with open('image.jpg', 'wb') as file:
file.write(data)
conn.close()
El código del lado del Android es,
public void send(View v) {
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(i, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {
try {
final Uri imageUri = data.getData();
final InputStream imageStream = getContentResolver().openInputStream(imageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imageView.setImageBitmap(selectedImage);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
selectedImage.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] array = byteArrayOutputStream.toByteArray();
SendImageClient sendImageClient = new SendImageClient();
sendImageClient.execute(array);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
Toast.makeText(this, "no image selected", Toast.LENGTH_SHORT).show();
}
}
public class SendImageClient extends AsyncTask<byte[], Void, Void> {
@Override
protected Void doInBackground(byte[]... voids) {
try {
Socket socket= new Socket("192.168.0.106",8888);
OutputStream out=socket.getOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(out);
dataOutputStream.writeInt(voids[0].length);
dataOutputStream.write(voids[0],0,voids[0].length);
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Image sent", Toast.LENGTH_SHORT).show();
}
});
dataOutputStream.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Su código Python es truncar el archivo de salida en cada ejecución del bucle. En la última vuelta, cuando se cierra la conexión, el archivo se trunca, conn.recv
devolverá una cadena vacía, y nada más se escribe en el archivo.
Mover with open(..)
fuera del bucle que lee desde el zócalo y manejar el cierre de conexión de modo que usted no tiene un bucle infinito:
with open('image.jpg', 'wb') as file:
while True:
data = conn.recv(1024)
if not data: break
file.write(data)
Su código de Java está enviando el tamaño de los datos se envían antes de los datos en sí - se debe quitar esto o ajustar el código Python para tener esto en cuenta.
dataOutputStream.writeInt(voids[0].length);
dataOutputStream.write(voids[0],0,voids[0].length);