我的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();
}
}
}
}