Autore Topic: inserire immagine da db Mysql in una listview  (Letto 2344 volte)

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
inserire immagine da db Mysql in una listview
« il: 10 Settembre 2013, 15:52:08 CEST »
0
Ciao a tutti, sto sviluppando con Android Studio una semplice applicazione che deve leggere dei dati, tra cui delle immagini, da un db Mysql, e inserirle in una listview

il codice php lato sever è questo
Codice: [Seleziona]
<?php
 
/*
 * Following code will list all the products
 */
 
// array for JSON response
$response = array();
 
// include db connect class
require_once __DIR__ . '/db_connect.php';
 
// connecting to db
$db = new DB_CONNECT();
 
// get all products from products table
$result = mysql_query("SELECT *FROM prodotti") or die(mysql_error());
 
// check for empty result
if (mysql_num_rows($result) > 0) {
    // looping through all results
    // products node
    $response["Prodotti"] = array();
 
    while ($row = mysql_fetch_array($result)) {
        // temp user array
        $product = array();
        $product["ID"] = $row["ID"];
        $product["Nome"] = $row["Nome"];
        $product["Descrizione"] = $row["Descrizione"];
        $product["Codice"] = $row["Codice"];
        $product["Note"] = $row["Note"];
        $product["Immagine"] = base64_encode($row["Immagine"]);

 
        // push single product into final response array
        array_push($response["Prodotti"], $product);
    }
    // success
    $response["success"] = 1;
 
    // echoing JSON response
    echo json_encode($response);
} else {
    // no products found
    $response["success"] = 0;
    $response["message"] = "Nessun prodotto trovato";
 
    // echo no users JSON
    echo json_encode($response);
}
?>

la mia activity su AS è questa

Codice (Java): [Seleziona]
package it.amoschella.caffe_mauro;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.app.Activity;


import android.view.Menu;


import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.util.Base64;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AllProductsActivity extends ListActivity {

    // Progress Dialog
    private ProgressDialog pDialog;

    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();

    ArrayList<HashMap<String, String>> productsList;

    // url to get all products list
    private static String url_all_products = "http://mioserver/get_all_products.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PRODUCTS = "Prodotti";
   private static final String TAG_PID = "ID";
   private static final String TAG_NAME = "Nome";
    private static final String TAG_COD = "Codice";
    private static final String TAG_NOTE = "Note";
    private static final String TAG_DESCR = "Descrizione";
private static final String TAG_IMG = "Immagine";


    // products JSONArray
    JSONArray products = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_products);

        // Hashmap for ListView
        productsList = new ArrayList<HashMap<String, String>>();

        // Loading products in Background Thread
        new LoadAllProducts().execute();

        // Get listview
        ListView lv = getListView();

        // on seleting single product
        // launching Edit Product Screen
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String ID = ((TextView) view.findViewById(R.id.ID)).getText()
                        .toString();

                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        EditProductActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, ID);

                // starting new activity and expecting some response back
//                startActivityForResult(in, 100);
            }
        });

    }

    // Response from Edit Product Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted product
            // reload this screen again
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }

    }

    /**
     * Background Async Task to Load all product by making HTTP Request
     * */

    class LoadAllProducts extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AllProductsActivity.this);
            pDialog.setMessage("Loading products. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting All products from url
         * */

        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

            // Check your log cat for JSON reponse
            Log.d("All Products: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // products found
                    // Getting Array of Products
                    products = json.getJSONArray(TAG_PRODUCTS);

                    // looping through All Products
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);

                        // Storing each json item in variable
                        String ID = c.getString(TAG_PID);
                        String Nome = c.getString(TAG_NAME);
                        String Codice = c.getString(TAG_COD);
                        String Descrizione = c.getString(TAG_DESCR);
                        String Note = c.getString(TAG_NOTE);
                    String immagine = c.getString(TAG_IMG);
                        byte[] rawImage = Base64.decode(immagine, Base64.DEFAULT);
                        Log.i("Byte",""+rawImage.length);
                        Bitmap bmp = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
                        ImageView imageview = (ImageView) findViewById(R.id.Immagine2);
                        imageview.setImageBitmap(bmp);
                        /*byte[] encodeByte = Base64.decode(Immagine, Base64.DEFAULT);
                        Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0,
                                encodeByte.length);
                        ImageView image = (ImageView) findViewById(R.id.Immagine2);
                        image.setImageBitmap(bitmap);*/


                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, ID);
                        map.put(TAG_NAME, Nome);
                        map.put(TAG_DESCR, Descrizione);
                      map.put(TAG_COD, Codice);
                        map.put(TAG_NOTE, Note);
                        map.put(TAG_IMG, immagine);

                        // adding HashList to ArrayList
                        productsList.add(map);
                    }
                } else {
                    // no products found
                    // Launch Add New product Activity
                    Intent i = new Intent(getApplicationContext(),
                            NewProductActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/

        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */

                    ListAdapter adapter = new SimpleAdapter(
                            AllProductsActivity.this, productsList,
                            R.layout.list_item, new String[] { TAG_PID ,TAG_NAME,TAG_COD,TAG_NOTE,TAG_DESCR, TAG_IMG},
                            new int[] { R.id.ID,  R.id.Nome,R.id.Codice,R.id.Note,R.id.Descrizione, R.id.Immagine2});
                    // updating listview
                    setListAdapter(adapter);
                }
            });

        }

    }
}

i miei file xml sono questi
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:baselineAligned="false">

    <!-- Product id (pid) - will be HIDDEN - used to pass to other activity -->
    <TextView
       android:id="@+id/ID"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:visibility="gone" />

    <!-- Name Label -->
    <TextView
           android:id="@+id/Codice"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:paddingTop="6dip"
           android:paddingLeft="6dip"
           android:textSize="17dip"
           android:textStyle="bold"
           android:textColor="@android:color/black"
           android:background="#a00f2a"/>

    <TextView
       android:id="@+id/Nome"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:paddingTop="6dip"
       android:paddingLeft="6dip"
       android:textSize="17dip"
       android:textStyle="bold"
       android:background="#a00f2a"
       android:textColor="@android:color/black"/>

    <ImageView
           android:id="@+id/Immagine2"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="left|center_vertical"/>

    <TextView
           android:id="@+id/Descrizione"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:paddingTop="6dip"
           android:paddingLeft="6dip"
           android:textSize="17dip"
           android:textStyle="bold"
           android:textColor="@android:color/black"
           android:background="#a00f2a"/>
    <TextView
           android:id="@+id/Note"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:paddingTop="6dip"
           android:paddingLeft="6dip"
           android:textSize="17dip"
           android:textStyle="bold"
           android:textColor="@android:color/black"
           android:background="#a00f2a"/>

</LinearLayout>

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity"
   android:background="#871c16"
   android:gravity="center_vertical|center_horizontal">

    <LinearLayout
           android:layout_width="210dp"
           android:layout_height="fill_parent"
           android:orientation="vertical"
           android:layout_alignParentTop="true"
           android:layout_centerHorizontal="true"
           android:layout_marginTop="206dp">

        <Button
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="Prodotti"
               android:id="@+id/button"
               android:layout_gravity="center_vertical"/>
                <!--android:onClick="goProducts"-->


        <Button
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="Foto"
               android:id="@+id/button2"
               android:layout_gravity="center_vertical"/>

        <Button
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text="Video"
               android:id="@+id/button3"
               android:layout_gravity="center_vertical"/>
        <Button android:id="@+id/btnCreateProduct"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:text="Add New Products"
               android:layout_marginTop="25dip"/>
    </LinearLayout>
</RelativeLayout>

non risulatano errori in fase di compilazione, ma quando eseguo sull'emulatore crasha immancabilmente
il logcat è questo:

Codice: [Seleziona]
13:42:50.867    2144-2161/? D/All Products:: {"success":1,"Prodotti":[{"Immagine":"iVBORw0KGgoAAAANSUhEUgAAAOQAAADmCAYAAADFnymGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADrWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBSaWdodHM9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9yaWdodHMvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wUmlnaHRzOk1hcmtlZD0iRmFsc2UiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0idXVpZDo4RTZBQjhBNzkxREFERTExOTVDNUI2RTk5MjJBQjNCMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0Qjc0RTUwQzZGRjIxMURGOEZDQkNCNDRGMDU1M0I4QSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0Qjc0RTUwQjZGRjIxMURGOEZDQkNCNDRGMDU1M0I4QSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyNzc2OUVDOUYwNkZERjExOEExQUM3MEQzMzY5Rjg0RiIgc3RSZWY6ZG9jdW1lbnRJRD0idXVpZDo4RTZBQjhBNzkxREFERTExOTVDNUI2RTk5MjJBQjNCMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI\/Psp9It4AAPcZSURBVHhe7H0HnCVFtf43c\/OdnHZm8y4b2ARLzhkERJKgoqIYQFDBnLMYEMUAPrOiIkEEVIIgUZSgBMlL2F02552cb57\/953qunNndhZ97zHI\/\/3mzPTt7uqKp06sqq4uGyJgAiZgAl4VUB6cJ2ACJuBVABMMOQET8CqCCYacgAl4FcEEQ07ABLyKYIIhJ2ACXkUwwZATMAGvIphgyAmYgFcRTDDkBEzAqwgmGHICJuBVBBMMOQET8CqCCYacgAl4FcEEQ07ABLyKYIIhJ2ACXkUwwZATMAGvIphgyAmYgFcRTDDkBEzAqwgmGHICJuBVBBMMOQET8CqCCYacgAl4FcEEQ07ABLyKYIIhJ2ACXkUwwZATMAGvIphgyAmYgFcRTDDkBEzAqwgmGHICJuBVBBMMOQET8CqCCYacgAl4FcEEQ07ABLyKYIIhJ2ACXkUwwZATMAGvIphgyAmYgFcRTDDkBEzAqwgmGHICJuBVBBMMOQET8CqC\/+gnzdN9KQzxL5fLIYQy5AZSKKRzKOTyKIuU8zqLfBmQ6h5ApDqGdFc\/hsKMl80il88jw\/tsJsMwxukZQD6VRlkojIraGoSjYWSzGYTKyxFiWKZrEA2zm1EWi2IoW0AsFkaoMoEQ71kEkC9giOWWR0IoDGaQ6u1D+5ZW1q4MIUYoZLIoT8ZRPlSG+KQa5FleWW4IoUQM0eokUrksBnKsC\/MZ2NqJLOsyVFaGsjyQaKxGiPlme1LY95QjUc46TcAEjAX\/EYZcfv+D2O3Io5FoqkA0kcBgZxd2y0SQTMRRFiZDZNPIDKbIdGlkcwVjyqGhPPKsqa+smMgYKYAwiT9URuZjjPxQAWlGFNlHGSkeipApyRAZMizjTW6YRf4rYLC3F53ZduQYT\/kWeJDHUFEWQi\/LizBtZTiJsjiZmA\/Tg30sgwKhkC3GF8R5PKHn7laVYeGqQFDDlGI72LitDVMnNQR3\/x8BmyDhOUS86bqMbRPp+MOe8yz82o1+C+6+LFTuwnUdHBMwNvxHGPKar34ZZ373EtTGScrUIMlIHItzEcTYyeWRKLUaz\/zLUnMOURuykiSAEJkow84NMQcSg\/2VI5Ml45IRs4yXzeTsSSQS4Znabqic11EkY0nmCdOWmWyO2jOKGAWBNHGeWrSMDJhOD4rKkEpTG7OMPNktUh5DZXUNkvEkiY3pYhQY1MzShunMILLpFML8K2eezw904IlsP5pratE8ZRrq62qRSWdMSws2rFuHrZs3YcX6zZg3fbKFvZwgRskTX1mVSashL3zwSLOOmVQKA4ODSPHo6exET1c3+lODDE+jp7cHXT3d6GJYmgIrzbhptm+IFop6IRIJIxZPEG9ZxKO0Big0y4knCbTqykrEaSEkq6pRV1ODalomMVocccavqa\/lswrE2BeghVJgHyqvMPsxw\/xzxJnYMpum0GXeg4O0cGi5pFh+ns8SzEdWieKFy8OIUlCr\/AiFY1T9R9qRdRMLk15YRiTGg30djkYQDlMAM\/7\/j\/AfYcjHbrsV+7z9LFRlyRDs2AoS+qHxaoSpAsslTVmlcnail6PSdGVkpqECudd0oGQwGY6dq+s8zUTylBFQlNowk8+yg+LIkzjFZNKuYYaHw7RtGTHMzgqTOETASlvIk5B5rfRZaWXGzzI8xjzE2uUSDCwrXt+AIRJynvVLJCtMA4SpOoeozZf1teH+dA\/mTZmJRUsWk8BS6O\/sQKySGpZm7oZVq9A\/MIh7H34QsyY3s9b\/GsRkaeaTGuhHf1cP+sk4PT2d6OO5s7vdhIS0dYF1yORSiCWTFDKsq3R3IUf8RJDKpNDW2ooNG7bgxTXrsbWz2xgxT2EldBbY1hwFkwRjTnhnO0M098uVBQVjkkRuuA\/IJEpiN4ObVkCI+Ayxz8SwMcbJEY\/KJ56IEj9JCrIY4jExUYL9PISqygpjKlkWBetLYDCVQT+FhoSINGeeJkp1bTWiTCshoj5S+9RfMTJjjH1XQSFQX1ONyZMnoaq6GolE0p5LUMjFUN5Z0hYTOualYIjHEoiyP+W+xMnMiYpKSyfGfjXBf4Qhu9ZvQN3MGeyoJLmtQJMvhMMqGq2jRRBm2vDOOj4wDHWnDpPJKDCtybOIIk9CkFtWXsZOo4Qsp8aNsuN7errYOTJIxYCUoOyMckrbsKR4lBrSGI8HtV1Pb5dpEwmCZJTMLIJmGTWJKiNwYWmIxCeTWuWqhmVlCiTRsvBlg524tWMTGquqUEONnMlnWB6lOQkyx+v1a9agZvJ0LH\/hWdQmE2pCEaTNOrZux7oXVmDNyuXYtGUjtnRsIAHHUVtdgc6eHoa1oaIqgcVLdsOU5smmAeTz9vX1Y+uWzWTaPuImQkbtIJFTy1G7pGkxSPv0k6l13U\/\/PEUtmCHxiykzOdoTZPocCVg4VBuz9IPJ4wjxJl9WIC4p4Bhf+pLUTD6kxnMdQz+fDGlHzBijrr4OkyhsquurUEU8TG1spKVQTQaghUJBK4FaoAsyRAbLy9JgHfsobAbkr3d10JxvRev2VuR7U+hjO\/JiKvZRnH0aZZ+VU
09-10 13:42:51.357    2144-2161/? I/Byte: 64354
09-10 13:42:51.447    2144-2144/? I/Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.
09-10 13:42:51.587    2144-2144/? I/Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.
09-10 13:42:51.938    2144-2144/? I/Choreographer: Skipped 30 frames!  The application may be doing too much work on its main thread.
09-10 13:42:52.147    2144-2161/? W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x40a71930)
09-10 13:42:52.147    2144-2161/? W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x40a71930)
09-10 13:42:52.347    2144-2161/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
        java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:856)
        Caused by: java.lang.NullPointerException
        at it.amoschella.caffe_mauro.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:173)
        at it.amoschella.caffe_mauro.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:122)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)
        ... 4 more
09-10 13:42:52.527    2144-2144/? I/Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.
09-10 13:42:52.967      287-416/system_process W/ActivityManager: Force finishing activity it.amoschella.caffe_mauro/.AllProductsActivity
09-10 13:42:53.087    2144-2144/? I/Choreographer: Skipped 38 frames!  The application may be doing too much work on its main thread.
09-10 13:42:53.137      287-416/system_process W/WindowManager: Failure taking screenshot for (246x410) to layer 21020
09-10 13:42:53.707      287-301/system_process W/ActivityManager: Activity pause timeout for ActivityRecord{410194a0 u0 it.amoschella.caffe_mauro/.AllProductsActivity}
09-10 13:42:53.872      287-304/system_process I/Choreographer: Skipped 50 frames!  The application may be doing too much work on its main thread.
09-10 13:42:53.893    2144-2144/? I/Choreographer: Skipped 183 frames!  The application may be doing too much work on its main thread.
09-10 13:42:54.307        36-36/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property

se commento la parte relativa alla gestione dell'immagine funziona regolarmente, quindi credo sia un problema di decodifica, qualcuno saprebbe darmi una mano?

PS. analizzando il risultato della query risulta che la stringa con cui viene codificata l'immagine è sempre la stessa per ogni prodotto
« Ultima modifica: 10 Settembre 2013, 16:18:28 CEST da mrnino »

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #1 il: 10 Settembre 2013, 18:37:43 CEST »
0
Invece che inviare un'immagine codificata in base 64 (che occupa il quadruplo ma è ascii compatibile naturalmente) ti converrebbe preparare (se fattibile) una pagina PHP che si occupa solo di reperire l'immagine del prodotto e nella tua app scaricare l'immagine direttamente (magari in una directory di cache) con le classiche funzioni di networking.

Da PHP puoi fare:
- SELECT Immagine from Prodotti WHERE id = xxx
- imposti con header() i parametri content-type e content-length (questo aiuta molto i download)
- poi spari direttamente nell'output di PHP i dati binari dell'immagine
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #2 il: 10 Settembre 2013, 18:50:21 CEST »
0
Ti ringrazio per l'attenzione e per le idee, ma vorrei anche capire cosa c'è di sbagliato nel mio codice.


Inviato dal mio GT-I9070 con Tapatalk 2


Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #3 il: 10 Settembre 2013, 19:01:35 CEST »
0
Allora puoi provare a debuggare in questo modo:
- codifichi in base 64 un'immagine in locale
- ti salvi la stringa
- la copi nella variabile "immagine" in doInBackground()
Così capisci se il problema è lato client o lato server
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #4 il: 11 Settembre 2013, 10:11:31 CEST »
0
anche con la stringa passata direttamente nella variabile immagine crasha,

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #5 il: 11 Settembre 2013, 13:25:31 CEST »
0
Ok... ma esattamente cosa è a NULL?
Perché dal tuo screenshot del debugger sembra l' ImageViewer...
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #6 il: 11 Settembre 2013, 14:48:57 CEST »
0
si image è proprio l'ImageView, cercando in rete il problema potrebbe essere che sto tentando di riempire questa imageview durante il Doinbackground, e suggerivano di spostare questa parte nel Postexecute, facendo in modo che l'Asyntask restituisse la bitmap da passare poi come parametro al Postexecute, ma non sono riuscito ad ottenere alcun risultato.

qualcuno mi darebbe una mano a scrivere questa parte in maniera più efficace?
Codice (Java): [Seleziona]
package it.amoschella.caffe_mauro;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.app.Activity;
import android.util.Base64;
import android.view.Menu;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AllProductsActivity extends ListActivity {

    // Progress Dialog
    private ProgressDialog pDialog;

    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();

    ArrayList<HashMap<String, String>> productsList;

    // url to get all products list
    private static String url_all_products = "http://mioserver/get_all_products.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PRODUCTS = "Prodotti";
    private static final String TAG_PID = "ID";
    private static final String TAG_NAME = "Nome";
    private static final String TAG_COD = "Codice";
    private static final String TAG_NOTE = "Note";
    private static final String TAG_DESCR = "Descrizione";
    private static final String TAG_IMG = "Immagine";


    // products JSONArray
    JSONArray products = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_products);

        // Hashmap for ListView
        productsList = new ArrayList<HashMap<String, String>>();

        // Loading products in Background Thread
        new LoadAllProducts().execute();

        // Get listview
        ListView lv = getListView();

        // on seleting single product
        // launching Edit Product Screen
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // getting values from selected ListItem
                String ID = ((TextView) view.findViewById(R.id.ID)).getText()
                        .toString();

                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        EditProductActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, ID);

                // starting new activity and expecting some response back
//                startActivityForResult(in, 100);
            }
        });

    }

    // Response from Edit Product Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted product
            // reload this screen again
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }

    }

    /**
     * Background Async Task to Load all product by making HTTP Request
     * */

    class LoadAllProducts extends AsyncTask<String, String, Bitmap> { // se ritorna una bitmap non funzionerà l'hash map, vero?

        /**
         * Before starting background thread Show Progress Dialog
         * */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AllProductsActivity.this);
            pDialog.setMessage("Loading products. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting All products from url
         * */

        protected Bitmap doInBackground(String... args)
 Bitmap bmp=null;

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

            // Check your log cat for JSON reponse
            Log.d("All Products: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // products found
                    // Getting Array of Products
                    products = json.getJSONArray(TAG_PRODUCTS);

                    // looping through All Products
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);

                        // Storing each json item in variable
                        String ID = c.getString(TAG_PID);
                        String Nome = c.getString(TAG_NAME);
                        String Codice = c.getString(TAG_COD);
                        String Descrizione = c.getString(TAG_DESCR);
                        String Note = c.getString(TAG_NOTE);
                        String immagine = c.getString(TAG_IMG);
                        byte[] rawImage = Base64.decode(immagine, Base64.DEFAULT);
                        Bitmap bmp = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
                       

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, ID);
                        map.put(TAG_NAME, Nome);
                        map.put(TAG_DESCR, Descrizione);
                        map.put(TAG_COD, Codice);
                        map.put(TAG_NOTE, Note);
                        map.put(TAG_IMG, immagine); // devo eliminarlo?

                        // adding HashList to ArrayList
                        productsList.add(map);
                         return bmp;
                    }
                } else {
                    // no products found
                    // Launch Add New product Activity
                    Intent i = new Intent(getApplicationContext(),
                            NewProductActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/

        protected void onPostExecute(String file_url Bitmap bitmap) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */

                    ListAdapter adapter = new SimpleAdapter(
                            AllProductsActivity.this, productsList,
                            R.layout.list_item, new String[] { TAG_PID,
                            TAG_NAME,TAG_DESCR, TAG_COD, TAG_NOTE, TAG_IMG},
                            new int[] { R.id.ID, R.id.Nome, R.id.Descrizione, R.id.Codice, R.id.Note});
                         ImageView imageview = (ImageView) findViewById(R.id.immagine);
                        imageview.setImageBitmap(bmp);
                    // updating listview
                    setListAdapter(adapter);
                }
            });

        }

    }
}

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #7 il: 11 Settembre 2013, 19:11:22 CEST »
0
Effettivamente è corretto, non sei nel thread UI in onBackground.

Dentro doInBackground puoi mettere:
Codice (Java): [Seleziona]
map.put(TAG_IMG, bmp);  // "bmp" invece di "immagine"
Mentre dentro onPostExecute dovresti poter accedere direttamente alla tua ListView dell' Activity (senza la parte runOnUiThread...) perché sei ritornato nel thread UI. A quel punto puoi aggiungere gli elementi al tuo adapter e poi invocare notifyDataSetChanged() sull'adapter stesso per avvisare il ListView dei nuovi dati.

E puoi creare l'adapter nell' onCreate() dell' Activity e assegnarlo vuoto alla tua ListView.
Poi per visualizzare le immagini dovrai fare un override di getView() dell'adapter (se non lo hai già fatto) per visualizzare le righe del ListView in modo opportuno.
« Ultima modifica: 11 Settembre 2013, 19:16:04 CEST da matttt »
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #8 il: 11 Settembre 2013, 21:43:00 CEST »
0


Dentro doInBackground puoi mettere:
Codice (Java): [Seleziona]
map.put(TAG_IMG, bmp);  // "bmp" invece di "immagine"


errore in fase di compilazione, mi segnala che il metodo put non accetta bitmap come argomento in una HashMap..

 chiedo troppo se mi scrivi due righe di codice su tutto il resto che hai scritto?

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #9 il: 11 Settembre 2013, 22:15:03 CEST »
0
HashMap... ok come hai fatto tu allora, solo che poi dovrai fare la decodifica prima di piazzare l'immagine... ci sono sicuramente metodi più efficienti. Ad esempio potresti sostituire l' HashMap con un tuo oggetto (se non hai vincoli particolari). Ribadisco comunque che il sistema migliore secondo me rimane lo scaricamento delle immagini in forma binaria separatamente dal JSon.

Per il resto... chiedi molto :) ma vabbeh...
Ti faccio degli esempi, poi dovrai adattarli opportunamente e scrivendo codice così al volo so che introdurrò sicuramente degli errori:

- in onCreate():
Codice (Java): [Seleziona]
mAdapter = new MyAdapter<MyItem>( this );
mListView = (ListView) findViewById( R.id.my_list_view );
mListView.setAdapter( mAdapter );

- in onPostExecute():
Codice (Java): [Seleziona]
if( pDialog.isShowing() ) pDialog.dismiss();
// Qui dovresti ciclare i risultati che hai ottenuto ed aggiungerli opportunamente all'adapter
mAdapter.add( new MyItem( "Nome...", "Codice...", "Descrizione...", "Immagine..." ) );
// ...
mAdapter.notifyDataSetChanged();

- poi devi crearti una risorsa layout my_list_item.xml tipo (con i campi che vuoi far vedere nella tua listview):
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"
   android:padding="6dip">
    <TextView android:id="@+id/item_key"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="0.25"
       android:textAppearance="?android:attr/textAppearanceMedium"
       android:textColor="#888888"
   />
    <TextView android:id="@+id/item_value"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="0.75"
       android:textAppearance="?android:attr/textAppearanceMedium"
       android:textColor="#888888"
       android:textStyle="bold"
   />
</LinearLayout>

- e infine la parte più delicata - l'adapter:
Codice (Java): [Seleziona]
public class MyAdapter extends ArrayAdapter<MyItem>
{
        public MyAdapter( Context context )
        {
                super( context, R.layout.my_list_item );
        }

        @Override
        public View getView( int position, View convertView, ViewGroup parent )
        {
                ViewHolder holder = null;

                if( convertView == null )
                {
                        LayoutInflater inflater = getLayoutInflater();
                        convertView = inflater.inflate( R.layout.my_list_item, null );

                        holder = new ViewHolder();
                        holder.key = (TextView) convertView.findViewById( R.id.item_key );
                        holder.value = (TextView) convertView.findViewById( R.id.item_value );
                        convertView.setTag( holder );
                }
                else holder = (ViewHolder) convertView.getTag();

                MyItem item = getItem( position );
                holder.key.setText( item.key );
                holder.value.setText( item.value );

                return convertView;
        }

        private class ViewHolder
        {
                protected TextView key;
                protected TextView value;
        }
}

La parte un po' rognosa è personalizzare il ListView.
Se ti accontenti di roba già pronta nelle API è molto più semplice (puoi evitare gli ultimi 2 punti che ti ho scritto) ma non ti danno tanti modelli pronti. C'è la lista a singole stringhe, stringa + checkbox, 2 stringhe su una riga (sopra e sotto) e poco altro mi pare.

Post unito: 12 Settembre 2013, 08:48:41 CEST
Aggiungo che se vuoi maggiori informazioni su come personalizzare le ListView c'è questo tutorial:
[medio] ListView con layout personalizzato tramite un custom ArrayAdapter - Android Developers Italia
« Ultima modifica: 12 Settembre 2013, 08:48:42 CEST da matttt, Reason: Merged DoublePost »
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #10 il: 12 Settembre 2013, 09:27:19 CEST »
0
buongiorno, grazie ancora della collaborazione, se non si fosse ancora capito sono proprio alla prime armi con la programmazione (in generale, non solo su Android..)..

Se volessi fare un passo indietro e implementare la soluzione con il download separato delle immagini da dove mi consigli di partire? non saprei cosa cercare onestamente

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #11 il: 12 Settembre 2013, 13:00:20 CEST »
0
"Ogni viaggio inizia col primo passo" :)

Dai un'occhiata a questi 2 link della documentazione Android SDK:
AsyncTask | Android Developers
Processes and Threads | Android Developers

Trovi 2 buoni esempi su come realizzare una funzione che scarica in maniera asincrona un file e la assegna ad un ImageView.
Le mie apps su Google Play Store:

Offline mrnino

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance
  • Sistema operativo:
    Win 7
Re:inserire immagine da db Mysql in una listview
« Risposta #12 il: 13 Settembre 2013, 12:51:08 CEST »
0
quello che proprio non riesco ad implementare è l'associazione tra prodotto e immagine scaricata separatamente..

Con la parte funzionante del programma creo la lista dei prodotti e va bene, ma l'asyntask con il download separato delle immagini associate proprio non ci arrivo..

lato php la seconda query restituisce l'id e l'immagine giusto? dentro l'asyntask con un ciclo in doinBackground dovrei crearmi la lista delle bitmap decodificate e nel postExecute associarle alle imageview, no?

ogni aiuto è ben accetto

PS: è possibile lanciare 2 asynctask nella stessa activity? se si come?
« Ultima modifica: 13 Settembre 2013, 14:52:42 CEST da mrnino »

Offline matttt

Re:inserire immagine da db Mysql in una listview
« Risposta #13 il: 13 Settembre 2013, 18:31:06 CEST »
0
Puoi anche scaricare i dati e finito con quelli scaricare una o più immagini usando lo stesso thread.

Meglio Thread in questo caso che AsyncTask (se guardi nella documentazione il secondo sarebbe pensato per compiti brevi, di alcuni secondi)

Non so come vuoi realizzare la tua app ma immagino se io dovessi fare una query che ritorna n prodotti e di quelli scaricare le relative immagini farei così:
- scarico la lista coi risultati JSon dall'URL PHP tramite un thread;
- salvo i vari campi della lista in un ArrayList di Oggetti miei (con id, codice, descrizione, etc.)
- sempre nello stesso thread ciclo la lista di Oggetti appena creata;
- per ogni oggetto ricavo l'ID (o il codice o quel che mi serve per reperire l'immagine prodotto corrispondente);
- con l'ID scarico l'immagine corrispondente tramite una seconda pagina PHP (a cui passerai solo l'ID, eventualmente dati di autenticazione se necessario);
- salvo direttamente in una directory cache le immagini che scarico;
- poi nel mio ListView (/ ImageView) carico l'immagine da file.

Nel frattempo magari aggiorni una progress cambiando anche il testo in base all'operazione... "scarico i dati", "scarico l'immagine 1", etc.
C'è un po' di lavoro insomma... ma se fai un passo alla volta dovresti farcela.
Le mie apps su Google Play Store: