(ИЗМЕНЕНО) Android Одноранговая проблема получения прямого изображения Wi-Fi - PullRequest
1 голос
/ 03 апреля 2020

Я подключаю два устройства, используя 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 ' Буду признателен за любые предложения. Заранее спасибо.

...