2013-05-08 67 views
1

我正在開發一個android應用程序,該應用程序連接到php中的Web服務。用戶可以發送圖片,或者更好地說,將能夠發送圖片,因爲我被卡住了,給其他用戶。從Android中的Web服務中恢復base64圖像

現在,圖像通過類型爲xsd:base64binary的SOAP發送到Web服務。用戶拍照,並用數據字節數組被轉換成BASE64以這種方式發送之前:

String img; 
.... 
@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    img = Base64.encodeToString(data, Base64.NO_WRAP);   
} 

在服務器側,PHP存儲在MySQL BLOB列的img字符串。

當另一個用戶詢問圖片時,服務器從stdClass中檢索mysql中的數據,不僅是圖像,還有id,owner等等,並將所有這些數據封裝到帶有php函數的JSON字符串中json_encode。 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添加字符有關,我不知道...

更新:如果我硬編碼base64字符串從MySQL數據庫中,沒有創建位圖,如果我在拍攝照片的那一刻生成的base64字符串也一樣,那麼它就可以工作。

我在做什麼錯?

+0

什麼是圖像類型?是BMP還是JPEF還是PNG? – varun 2013-05-08 16:11:39

+0

該圖片沒有格式,它來自一個自定義的Camera Activity,並且該應用程序僅將字節數組存儲在SQLite中,因爲客戶端需求 – josecash 2013-05-08 16:18:28

+0

請看這裏http://stackoverflow.com/questions/6520745/why-does-bitmapfactory-decodebytearray -return-null – varun 2013-05-08 16:24:12

回答

1

經過幾天的這個問題,我有答案,這是一個MySQL問題。

顯然,MySQL BLOB類型最多隻能存儲64Kb(找到bug的線索是所有圖像佔用64Kb的空間...... aswer一直存在,但我看不到它。 ..)。所以在我的情況下,解決方案一直在改變LONGBLOB在MySQL中的BLOB類型...

謝謝大家爲你的時間。

0

儘管我仍然在思考這個問題,但有些東西讓我感到震驚:爲什麼要使用這麼多,只要使用HttpClient,cookie和檢索圖像而不是轉換爲&即可。

此外,如果可能的話,不建議存儲Blob,除非您的圖片尺寸較小。對我而言,一些設計更改會使整個代碼(服務器&電話)更易於管理。

+0

如果我這樣做是由於客戶端的要求,圖片永遠不會寫入手機存儲中,那不是點我可以處理。所以最後我需要至少將它存儲在SQLite中,但是,另一種方式可能是將字節發送到服務器,然後將它們寫入服務器中的文件,然後通過HTTP進行下載並將字節保存到SQLite中。但那就是我選擇的方式 – josecash 2013-05-08 17:12:09