Я подключаю два устройства, используя p2p wifi direct. Я успешно отправил текстовое сообщение с одного устройства на другое, но когда дело доходит до отправки изображения, я застрял. Я пытался закодировать изображение и декодировать на другой стороне, но сейчас изображение успешно отправляется, однако на принимающей стороне оно не показывает никакого изображения, но создается папка speci c, но когда я открываю изображение через диспетчер файлов он говорит «Формат файла не поддерживается» и изображение не открывается. Размер изображения составляет 2,92 КБ.
Еще одна вещь, которую я хочу спросить, - как я могу отправить на указанное устройство c, я пытался указать адрес принимающего устройства Inet, но это не не работает для меня.
Вот мой код
Для стороны сервера
public class ServerClass extends Thread {
Socket socket;
ServerSocket serverSocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(8888);
socket = serverSocket.accept();
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SendReceive extends Thread {
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
private DataInputStream dataInputStream;
int length;
byte[] Bbytes;
public SendReceive(Socket sckt) {
socket = sckt;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
int bytes;
while (socket != null) {
try {
dataInputStream=new DataInputStream(inputStream);
length=dataInputStream.readInt();
Bbytes=new byte[length];
dataInputStream.readFully(Bbytes,0,Bbytes.length);
bytes = inputStream.read(Bbytes);
handler.obtainMessage(MESSAGE_READ, bytes, -1,
Bbytes).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//sending images
public void writeImageData(byte[] bytes){
try {
DataOutputStream dataOutputStream=new
DataOutputStream(outputStream);
dataOutputStream.writeInt(bytes.length);
dataOutputStream.write(bytes, 0, bytes.length);
}catch (IOException e) {
e.printStackTrace();
}
}
}
На стороне клиента
public class ClientClass extends Thread {
Socket socket;
String hostAdd;
public ClientClass(InetAddress hostAddress) {
hostAdd = hostAddress.getHostAddress();
socket = new Socket();
}
@Override
public void run() {
try {
socket.connect(new InetSocketAddress(hostAdd, 8888), 700);
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Чтобы отправить изображение на клиент и я получаем этот тост как успешный
public class SendImageClient extends AsyncTask<byte[], Void, Void> {
@Override
protected Void doInBackground(byte[]... voids) {
try {
sendReceive.writeImageData(voids[0]);
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Image sent",
Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Обработчик для получения и чтения сообщения
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what) {
case MESSAGE_READ:
byte[] readBuff = (byte[]) msg.obj;
Bitmap bitmap=
BitmapFactory.decodeByteArray(readBuff,0,readBuff.length);
imageView22.setImageBitmap(bitmap);
saveImage(bitmap);
break;
}
return true;
}
});
//to save image in device
private void saveImage(Bitmap finalBitmap){
String root= Environment.getExternalStorageDirectory().toString();
File myDir= new File(root+"/saved_images");
myDir.mkdirs();
Random generator= new Random();
int n=10000;
n=generator.nextInt(n);
String fname="Image-"+n+".jpg";
File file=new File(myDir,fname);
if(file.exists()){
file.delete();
}
try {
FileOutputStream out=new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100,out);
out.flush();
out.close();
Toast.makeText(this, "image saved ", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Наконец кнопка отправки
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawable = (BitmapDrawable) imageView.getDrawable();
bitmap = drawable.getBitmap();
imageView.setImageBitmap(bitmap);
ByteArrayOutputStream byteArrayOutputStream = new
ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, byteArrayOutputStream);
byte[] array = byteArrayOutputStream.toByteArray();
SendImageClient sendImageClient = new SendImageClient();
sendImageClient.execute(array);
}
});
I ' Буду признателен за любые предложения. Заранее спасибо.