我正在用 android 开发一个应用程序,它连接到 php 中的 web 服务。用户可以发送图片,或者更好地说,将能够发送图片,因为我被困在上面,给其他用户。
现在,图像通过类型为 xsd:base64binary 的 SOAP 发送到 Web 服务。用户拍照,带数据的字节数组在发送之前先转换成base64:
String img;
....
@Override
public void onPictureTaken(byte[] data, Camera camera) {
img = Base64.encodeToString(data, Base64.NO_WRAP);
}
在服务器端,php 将 img 字符串存储在 mysql BLOB 列中。
当另一个用户请求图片时,服务器从 mysql 中以 stdClass 检索数据,不仅包括图像,还包括 id、所有者等......并使用 php 函数 json_encode 将所有这些数据封装成 JSON 字符串。WSDL 文件中的返回类型是 xsd:string。回到 Android 我所做的是:
JSONArray array = new JSONArray(response);
JSONObject row;
String imgStr;
byte[] img;
for (int i = 0; i < array.length(); i++) {
row = array.getJSONObject(i);
...
imgStr = row.getString("image");
...
}
if (!TextUtils.isEmpty(imgStr)) {
img = Base64.decode(imgStr, Base64.NO_WRAP);
}
//Insert byte[] in android SQLite
dao.insert(id, owner, img);
SQLite 中的表列类型也是 BLOB。当我从 SQLite 获取图像并尝试将其转换为 Bitmap 对象时,问题就出现了。代码:
...
byte[] img = cursor.getBlob(cursor.getColumnIndex(DB.M_IMG));
Bitmap bmp = BitmapFactory.decodeByteArray(img, 0, img.length);
...
img 字节数组似乎没问题,但 bmp 始终为空...
我所做的一些测试是在图像所有者设备上获取 base64 字符串,然后再将其发送到位图并获得良好的结果,这就是为什么我认为我的问题与 json 或 php 编码或添加字符有关,我不知道...
更新:如果我对 mysql 数据库中的 base64 字符串进行硬编码,则不会创建位图,如果我对拍照时生成的 base64 字符串执行相同操作,则它可以工作。
我究竟做错了什么?