Android BitmapFactory经常在Base64解码的字节数组上返回null

时间:2015-09-30 14:51:03

标签: java android image sockets base64

我的PC上有一个Java服务器,使用臭名昭着的Robot类捕获屏幕截图,将它们编码为Base64字符串,然后使用PrintWriter将它们通过Socket发送到Android客户端

Android客户端读取Base64编码的字符串,将它们转换回字节数组,然后转换为Bitmap图像,以便在ImageView中显示。

问题在于,虽然这有时会按预期工作,但BitmapFactory.decodeByteArray方法通常会返回null,因此不会向ImageView呈现任何内容。
在Logcat D/skia﹕ --- decoder->decode returned false

中给我一条消息

我可以通过更改PC上显示的内容来重现成功/不成功的解码,它可以像突出显示一行屏幕文本一样简单,这将导致解码开始失败并且取消突出显示将使其返回成功。< / p>

当解码失败时,我尝试将它与服务器发送的字符串(总是100%相同)进行比较,并使用外部工具Base64 to Image Converter验证Base64编码,该工具始终显示完美的形象。

在运行Android 4.1的真实设备和Android 5.1上的模拟设备上都会发生这种情况

到目前为止,已经花了2天时间仔细阅读SO和互联网一般寻找答案,但没有发现任何适合我情况的东西。

为什么BitmapFactory方法经常失败? 或者我在客户端代码中填写了一些东西?

Android客户端代码

public class MainActivity extends Activity {

    private Socket socket;
    private static final int SERVERPORT = 6666;
    private static final String SERVER_IP = "192.168.2.5";
    private ImageView imgContainer;
    private Bitmap bitmapObj;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgContainer = (ImageView) findViewById(R.id.imgContainer);
        new Thread(new ConnectionThread()).start();
    }

    private class ConnectionThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // first line is garbage
                String inStr=in.readLine();
                //image receiver loop
                while((inStr = in.readLine()) != null){
                    // log shows string is always same length as the one sent
                    Log.d("IMGTHREAD", String.valueOf(inStr.length()));

                    byte[] img64 = Base64.decode(inStr, Base64.DEFAULT);

                    //Fails here, bitmapfactory decode often returns null? but not always
                     bitmapObj = BitmapFactory.decodeByteArray(img64, 0, img64.length);

                        // update the imgContainer ImageView
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                imgContainer.setImageBitmap(bitmapObj);
                            }
                        });

                }

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}

0 个答案:

没有答案