Как преобразовать данные Blob в MYSQL в Android ImageView

Android 3.1 (API 12) – Строго, это коммерческое приложение и не будет на других устройствах.

Я (n00b) пытаюсь получить массив изображений, хранящихся как Blobs в Mysql на наших серверах, и добавить их в ImageView на Android.

Во-первых, на стороне сервера: я не уверен, есть ли base64_encode или json_encode , вот мой текущий PHP и результаты.


PHP:

 $query = "SELECT `locations`.`businessName`, `photos`.`img` FROM `locations` JOIN `photos` ON `locations`.`co_id` = `photos`.`co_id` WHERE `locations`.`businessName` = '".$companyID."'"; mysql_connect($dbserver, $dbusername, $dbpassword) or die(mysql_error()); mysql_select_db($dbname) or die(mysql_error()); $result = mysql_query($query) or die(mysql_error()); while ($row = mysql_fetch_array($result)) { $finalImg[] = $row['img']; foreach ($finalImg as $img) { $finallyWeAreThere = base64_encode($img); } } echo $finallyWeAreThere; mysql_close(); 

Результат:

 /9j/4AAQSkZJRgABAQEAYABgAAD/... and so on.. and so on.. 

Теперь на стороне Android. Прежде чем попытаться потянуть изображения, я подключусь к одной и той же базе данных в другой Activity чтобы получить список имен компаний (успешно), после нажатия на название компании, когда изображения собираются путем передачи имени компании по намерению моей основной класс.

Я использовал успех сбора моего имени компании в качестве стартовой площадки, поэтому этот файл файла Main.java является очень сырым и потенциально очень неправильным.

Main.java (прямо сейчас, я не включил цикл for или while для отображения всех изображений, я был бы рад получить только одно изображение, возвращенное в этот момент):

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Get the appropriate layout setContentView(R.layout.main); Bundle extras = getIntent().getExtras(); businessName = extras.getString("companyName"); // Load AsyncTask to get photos from server new RetrievePhotos().execute(businessName); } class RetrievePhotos extends AsyncTask<String, String, Void> { private ProgressDialog progressDialog = new ProgressDialog(Main.this); InputStream inputStream = null; String result = ""; protected void onPreExecute() { progressDialog.setMessage("Gathering photos..."); progressDialog.show(); progressDialog.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface diaInterface) { RetrievePhotos.this.cancel(true); diaInterface.dismiss(); } }); } @Override protected Void doInBackground(String... params) { String url_select = "http://www.someCompany.com/someFile.php?imgTest=true&companyName=" + businessName; imView = (ImageView)findViewById(R.id.imageView1); ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); try { // Set up HTTP post HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url_select); httpPost.setEntity(new UrlEncodedFormEntity(param)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); // Read content & Log inputStream = httpEntity.getContent(); bmImg = BitmapFactory.decodeStream(inputStream); imView.setImageBitmap(bmImg); Log.i("HttpClient", "Called on the HTTP Client and went to: " + url_select); } catch (UnsupportedEncodingException e1) { Log.e("UnsupportedEncodingException", e1.toString()); e1.printStackTrace(); } catch (ClientProtocolException e2) { Log.e("ClientProtocolException", e2.toString()); e2.printStackTrace(); } catch (IllegalStateException e3) { Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); } catch (IOException e4) { Log.e("IOException", e4.toString()); e4.printStackTrace(); } // Convert response to string using String Builder try { BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); StringBuilder sBuilder = new StringBuilder(); String line = null; while ((line = bReader.readLine()) != null) { sBuilder.append(line + "\n"); } inputStream.close(); result = sBuilder.toString(); } catch (Exception e) { Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString()); } return null; } // end doInBackground 

XML:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/hsdarker" android:baselineAligned="false" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="150dp" android:layout_height="112dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="75dp" android:layout_marginTop="50dp" /> <ImageView android:id="@+id/imageView2" android:layout_width="300dp" android:layout_height="225dp" android:layout_below="@id/imageView1" android:layout_toRightOf="@id/imageView1" /> <ImageView android:id="@+id/imageView3" android:layout_width="150dp" android:layout_height="112dp" android:layout_alignTop="@id/imageView1" android:layout_marginLeft="208dp" android:layout_toRightOf="@id/imageView2" /> <ImageView android:id="@+id/imageView4" android:layout_width="300dp" android:layout_height="225dp" android:layout_below="@id/imageView3" android:layout_marginRight="75dp" android:layout_toRightOf="@id/imageView3" /> </RelativeLayout> 

Журнал ошибок Logcat:

 07-17 09:39:00.775: W/dalvikvm(5222): threadid=11: thread exiting with uncaught exception (group=0x40202760) 07-17 09:39:00.775: E/AndroidRuntime(5222): FATAL EXCEPTION: AsyncTask #2 07-17 09:39:00.775: E/AndroidRuntime(5222): java.lang.RuntimeException: An error occured while executing doInBackground() 07-17 09:39:00.775: E/AndroidRuntime(5222): at android.os.AsyncTask$3.done(AsyncTask.java:266) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.lang.Thread.run(Thread.java:1020) 07-17 09:39:00.775: E/AndroidRuntime(5222): Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 82: http://www.holidaysigns.com/db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.net.URI.create(URI.java:769) 07-17 09:39:00.775: E/AndroidRuntime(5222): at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79) 07-17 09:39:00.775: E/AndroidRuntime(5222): at holidaysigns.nst.Main$RetrievePhotos.doInBackground(Main.java:148) 07-17 09:39:00.775: E/AndroidRuntime(5222): at holidaysigns.nst.Main$RetrievePhotos.doInBackground(Main.java:1) 07-17 09:39:00.775: E/AndroidRuntime(5222): at android.os.AsyncTask$2.call(AsyncTask.java:252) 07-17 09:39:00.775: E/AndroidRuntime(5222): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 07-17 09:39:00.775: E/AndroidRuntime(5222): ... 4 more 

Я исследовал без остановок на этом, и, честно говоря, я не имею ни малейшего понятия, куда идти в этот момент, или если я настраиваю его правильно на стороне сервера. Прошу прощения за то, что я n00b. Любая помощь или руководство очень ценится.

У вас есть 2 проблемы.

Во-первых, ваш URL-адрес неправильно закодирован. Скорее всего, пространство в businessName вызывает у вас проблему. Вам нужно URLEncoder.encode (businessName, «UTF-8») для обработки любых пробелов или специальных символов, которые могут отображаться в businessName's.So «companyName = HOLIDAY SIGNS» станет «companyName = HOLIDAY + SIGNS».

Вторая проблема заключается в том, что вы пытаетесь установить ImageView внутри фонового потока. Вам необходимо установить содержимое ImageView в основной поток (поток пользовательского интерфейса). Измените doInBackground (), чтобы вернуть декодированное растровое изображение вместо void и добавить метод onPostExcecute (Bitmap bitmap), который установит растровое изображение в ImageView. onPostExecute работает в потоке пользовательского интерфейса. (Обязательно проверьте значение null).

URL-адрес

 http://www.holidaysigns.com/db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS 

имеет незаконный характер, согласно исключению.

Этот символ – это пробел, "". Замените все пробелы знаком плюса (+) и повторите попытку!

Причина, по которой пробелы являются незаконными, заключается в следующем:

Типичный HTTP-запрос инициируется следующим образом:

 GET /url HTTP/1.1 

Таким образом, три вещи разделены пробелами: методом, URI и версией протокола HTTP. Что, если вы разместите там URL-адрес, подобный вашему?

 GET /db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY SIGNS HTTP/1.1 Method: GET URL: /db/nstCompanyList.php?imgTest=true&companyName=HOLIDAY HTTP VERSION: SIGNS 

… Что-то пошло не так, не так ли?

И поэтому пробелы не допускаются.