2010-11-15 2 views
7

Quello che sto cercando di fare è questo: io voglio la mia applicazione per scaricare un'immagine da Internet e salvarlo al memoria interna del telefono in una posizione privata dell'applicazione. Se non è disponibile alcuna immagine per la voce dell'elenco (ovvero non può essere trovata su Internet), voglio un'immagine di segnaposto predefinita da visualizzare. Questa è l'immagine che ho definito nel mio file list_item_row.xml come predefinita.Android - il download di immagini dal web, il salvataggio in memoria interna in posizione riservata alla app, esposizione per la voce di elenco

Nel mio file ListActivity, che io chiamo un'istanza di una classe CustomCursorAdapter ho scritto. È in CustomCursorAdapter in cui sto iterando attraverso tutte le voci dell'elenco e definendo quale contenuto deve essere mappato alle viste, incluso il file immagine cercando di leggerlo dalla memoria interna.

Ho visto diverse domande su questo argomento, ma gli esempi sono specifici della memoria del telefono esterno (ad es. SDCard), comportano il salvataggio di stringhe invece di immagini o implicano l'uso di Bitmap.CompressFormat per ridurre la risoluzione del file (che non è necessario nel mio caso, poiché queste immagini saranno piccole miniature di risoluzione già piccola). Cercando di mettere insieme il codice di ogni esempio è stato difficile, quindi la mia domanda sul mio esempio specifico.

Al momento, credo che ho scritto codice valido, ma nessuna immagine è la visualizzazione per le mie voci di elenco, tra cui l'immagine predefinita segnaposto. Non so se il problema è causato da un codice di download/salvataggio non valido o da un codice di lettura non valido: non è di aiuto sapere che non so come controllare la memoria interna per vedere se l'immagine esiste.

In ogni caso, ecco il mio codice. Qualsiasi aiuto sarebbe molto apprezzato.

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException { 
    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg"); 
    URLConnection connection = url.openConnection(); 
    InputStream input = connection.getInputStream(); 
    FileOutputStream output = 
     c.openFileOutput(productID + "-thumbnail.jpg", Context.MODE_PRIVATE); 
    byte[] data = new byte[1024]; 

    output.write(data); 
    output.flush(); 
    output.close(); 
    input.close(); 
} 

CustomCursorAdapter.java

public class CustomCursorAdapter extends CursorAdapter { 
    public CustomCursorAdapter(Context context, Cursor c) { 
     super(context, c); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 

     String fileName = 
       cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_IMAGE_FILE_PATH)); 

     Bitmap bMap = BitmapFactory.decodeFile(fileName); 
     thumbnail.setImageBitmap(bMap); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.list_item_row, parent, false); 
     bindView(v, context, cursor); 
     return v; 
    } 
} 

risposta

2

Sembra semplicemente riferimento al nome del file immagine quando si cerca di leggere non era sufficiente, e ho dovuto chiamare getFilesDir() per ottenere il percorso del file di archiviazione. Di seguito è riportato il codice che ho usato:

String path = context.getFilesDir().toString(); 
String fileName = cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_PRODUCT_ID)); 

if (fileName != null && !fileName.equals("")) { 
    Bitmap bMap = BitmapFactory.decodeFile(path + "/" + fileName); 
    if (bMap != null) { 
     thumbnail.setImageBitmap(bMap); 
    } 
} 
+0

Quindi la mia domanda era valida: "Scrivi nel log in modo da essere sicuro di aver scritto e letto lo stesso file?". – dacwe

+0

Originariamente, non ero a conoscenza del fatto che fosse necessario qualcosa di più del nome del file e pensavo che l'applicazione fosse consapevole del percorso specifico in cui si trovava il file. – Keeb13r

7

sembra che un certo codice è lasciato fuori, ho ri-scritto in questo modo:

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException { 

    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg"); 

    InputStream input = null; 
    FileOutputStream output = null; 

    try { 
     String outputName = productID + "-thumbnail.jpg"; 

     input = url.openConnection().getInputStream(); 
     output = c.openFileOutput(outputName, Context.MODE_PRIVATE); 

     int read; 
     byte[] data = new byte[1024]; 
     while ((read = input.read(data)) != -1) 
      output.write(data, 0, read); 

     return outputName; 

    } finally { 
     if (output != null) 
      output.close(); 
     if (input != null) 
      input.close(); 
    } 
} 
+0

L'applicazione non verrà compilato con quel codice. Dice che le variabili di input e output devono essere inizializzate. Mi sono corretto in righe problematiche per dire "InputStream input = null" e "FileOutputStream output = null", ma sto ancora avendo lo stesso problema con nessuna visualizzazione delle immagini. – Keeb13r

+0

Sembra che l'errore che sto ottenendo sia questo: "java.io.IOException: Is a directory". Non sono sicuro di cosa pensare, dal momento che ho pensato che semplicemente specificando il nome del file senza introdurre alcuna cartella intervallata avrebbe comportato il percorso di scrittura e lettura esattamente lo stesso. – Keeb13r

+0

Hum, ID prodotto contiene barre ('/')? – dacwe

-1
void writeToFile(Bitmap _bitmapScaled) 
    { 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     _bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes); 
     try{ 
     File f; 
     //you can create a new file name "test.jpg" in sdcard folder. 
     if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
      f =new File(android.os.Environment.getExternalStorageDirectory(),"FamilyLocator/userimages/"+imageName); 
     else 
     f = new File(Environment.getDataDirectory(),"FamilyLocator/userimages/"+imageName); 

     f.createNewFile(); 
     //write the bytes in file 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     // remember close de FileOutput 
     fo.close(); 
     }catch(Exception e){e.printStackTrace();} 
    } 
+0

Questo codice non è veramente rilevante per la domanda e non viene nemmeno compilato. Penso che ci sia valore nel delineare l'algoritmo per mantenere la bitmap per uso futuro, tuttavia. – IcedDante