从Android中的Web服务恢复base64映像

时间:2013-05-08 16:01:22

标签: php android json web-services bitmap

我正在开发一个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 string存储在mysql BLOB列中。

当另一个用户询问图片时,服务器从stdClass中的mysql中检索数据,不仅包括图像,还包括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始终为null ...

我做过的一些测试是在发送它之前在图像所有者设备上获取base64字符串并将其传递给位图并获得良好结果,这就是为什么我认为我的问题与json编码或添加字符有关php,我不知道......

更新:如果我从mysql数据库硬编码base64字符串,则不会创建位图,如果我对拍摄照片时生成的base64字符串执行相同操作,那么它就可以工作。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

经过几天这个问题后,我得到了答案,这是一个MySQL问题。

显然MySQL BLOB类型可以存储高达64Kb(找到错误的线索是所有图像占用64 Kb的相同空间...... aswer一直存在但我看不到它.. )。因此,就我而言,解决方案一直在改变LONGBLOB中的BLOB类型......

谢谢大家的时间。

答案 1 :(得分:0)

虽然我还在考虑这个问题,但有些事情让我感到震惊:为什么要使用这么多,当你只需使用HttpClient,cookie并检索图像而不是转换为&amp;来回。

此外,如果可能,强烈建议不要存储Blob,除非图片尺寸很小。对我来说,一些设计变更会使整个代码(服务器和手机)更易于管理。