6 Stimmen

Android - Herunterladen von Bildern aus dem Internet, Speichern im internen Speicher an einem für die App privaten Ort, Anzeigen für Listenelemente

Was ich versuche, ist Folgendes: Ich möchte, dass meine Anwendung ein Bild aus dem Internet herunterlädt und es im internen Speicher des Telefons an einem Ort speichert, der der Anwendung vorbehalten ist. Wenn für das Listenelement kein Bild verfügbar ist (d. h. es kann nicht im Internet gefunden werden), soll ein Standardplatzhalterbild angezeigt werden. Dies ist das Bild, das ich in meiner Datei list_item_row.xml als Standard definiert habe.

In meiner ListActivity-Datei rufe ich eine Instanz einer CustomCursorAdapter-Klasse auf, die ich geschrieben habe. Im CustomCursorAdapter durchlaufe ich alle Listenelemente und definiere, welche Inhalte den Ansichten zugeordnet werden müssen, einschließlich der Bilddatei, indem ich versuche, sie aus dem internen Speicher zu lesen.

Ich habe mehrere Fragen zu diesem Thema gesehen, aber die Beispiele sind entweder spezifisch für externen Telefonspeicher (z.B. SDCard), beinhalten das Speichern von Zeichenketten anstelle von Bildern, oder beinhalten die Verwendung von Bitmap.CompressFormat, um die Auflösung der Datei zu reduzieren (was in meinem Fall unnötig ist, da diese Bilder kleine Miniaturbilder mit bereits geringer Auflösung sein werden). Der Versuch, den Code aus den einzelnen Beispielen zusammenzusetzen, war schwierig, daher meine Frage zu meinem speziellen Beispiel.

Im Moment glaube ich, dass ich einen gültigen Code geschrieben habe, aber es wird kein Bild für meine Listenelemente angezeigt, auch nicht das Standard-Platzhalterbild. Ich weiß nicht, ob das Problem durch ungültigen Download/Speichercode oder ungültigen Lesecode verursacht wird - es hilft auch nicht, dass ich nicht weiß, wie ich den internen Speicher überprüfen kann, um zu sehen, ob das Bild existiert.

Wie auch immer, hier ist mein Code. Jede Hilfe würde sehr geschätzt werden.

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();
}

BenutzerdefinierterCursorAdapter.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;
    }
}

6voto

dacwe Punkte 42433

Es scheint, dass einige Codes ausgelassen wurden, ich habe sie wie folgt umgeschrieben:

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();
    }
}

2voto

Keeb13r Punkte 235

Es sieht so aus, als ob ein einfacher Verweis auf den Dateinamen des Bildes beim Versuch, es zu lesen, nicht ausreicht, und ich musste getFilesDir() aufrufen, um den Pfad des Dateispeichers zu erhalten. Unten ist der Code, den ich verwendet habe:

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);
    }
}

-1voto

Yuvraj Kakkar Punkte 1113
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();}
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X