簡體   English   中英

如何使用serversocket發送位圖

[英]How to send a bitmap using serversocket

我正在為Android制作一個多人繪圖應用程序,我需要將每個用戶制作的圖紙發送給一個玩家。 我正在使用服務器套接字。

我做的第一件事是將Bitmap轉換為字節數組,因此我可以使用host.write(byteArray)將其發送到Host。

        Bitmap bitmapImage = drawView.getBitmap();
        byte[] byteArray = getByteArray(bitmapImage);
        byteArrayLength = byteArray.length;

        MainWifiActivity.SendReceive host = MainWifiActivity.sendReceiveHost;
        if (host != null) {
            host.write(byteArray);
        }

下面的代碼是我的SendReceive類,它監聽inputStream,然后啟動一個Handler,它應該將Bitmap保存到內部存儲

    public class SendReceive extends Thread {
    private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;

    public SendReceive(Socket s) {
        socket = s;
        try {
            inputStream = s.getInputStream();
            outputStream = s.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }       
    @Override
    public void run() {

        byte[] buffer = new byte[1024];
        int bytes;
        int filesize;

        while (socket != null) {
            try {
                filesize = DrawingActivity.byteArrayLength;
                if(buffer.length != filesize && filesize > 0){
                    buffer = new byte[filesize];
                }
                bytes = inputStream.read(buffer,0 ,buffer.length);

                if (bytes > 0) {
                        Message mesg = handler.obtainMessage(IMAGE_MSG, bytes, -1, buffer);
                        mesg.sendToTarget();

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  }

和處理程序:

    Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {

        switch (msg.what) {
            case IMAGE_MSG:
                byte[] byteArray = (byte[]) msg.obj;
                Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
                saveBitmapToInternalStorage(bitmap);
        }
        return false;
    }
});

在saveBitmapToInternalStorage方法中,我得到一個java.lang.NullPointerException:嘗試在空對象引用上調用虛方法'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap $ CompressFormat,int,java.io.OutputStream)'

    private void saveBitmapToInternalStorage(Bitmap bmp) {
    File directory = getApplicationContext().getDir("imageDir", Context.MODE_PRIVATE);
    File myPath = new File(directory, UUID.randomUUID().toString() + ".png");
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(myPath);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
    } catch (Exception e) {
        Log.d("HELLO", "MY ERROR: " + e);
    } finally {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我知道BitmapFactory.decodeByteArray返回已解碼的位圖,如果圖像無法解碼,則返回null。

但為什么不解碼呢?

我認為這件事是錯的

FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(myPath);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
    } catch (Exception e) {

它應該是

FileOutputStream fos = new FileOutputStream(myPath);
    try {
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
    } catch (Exception e) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM