2017-07-24 4 views
0

Ich bin relativ neu zu Android, und ich versuche, eine Android-App so zu ändern, dass es ein Profilbild (vorzugsweise in PNG) von einer URL herunterlädt und speichert es in der com.companyName.AppName.whatever/files. Es sollte beachtet werden, dass die App ursprünglich in Unity erstellt und einfach erstellt und exportiert wurde.Android: Speichern von .png von URL in App internen Speicher

Hier ist mein Anfangscode:

URL url = null; 
try { 
    url = new URL(playerDO.getProfileURL()); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} 

InputStream input = null; 
try { 
    input = url.openStream(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

String fileName = playerDO.getId() + ".png"; 
FileOutputStream outputStream = null; 
try { 
    outputStream = openFileOutput(fileName, Context.MODE_PRIVATE); 

    byte[] buffer = new byte[256]; 
    int bytesRead = 0; 
    while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { 
     outputStream.write(buffer, 0, bytesRead); 
    }  
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     outputStream.close(); 
     input.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

EDIT: Hier ist mein anderer Code, wie von @Ashutosh Sagar

InputStream input = null; 
Bitmap image = null; 
try { 
    input = url.openStream(); 
    image = BitmapFactory.decodeStream(input); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

String fileName = playerDO.getId() + ".png"; 
FileOutputStream outputStream = null; 
File myDir = getFilesDir(); 

try { 
    Log.wtf("DIRECTORY", myDir.toString()); 
    File imageFile = new File(myDir, fileName); 
    if (!imageFile.exists()){ 
     imageFile.createNewFile(); 
     Log.wtf("ANDROID NATIVE MSG: WARN!", "File does not exist. Writing to: " + imageFile.toString()); 
    } 

    outputStream = new FileOutputStream(imageFile, false); 
    image.compress(Bitmap.CompressFormat.PNG, 90, outputStream); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     outputStream.close(); 
     input.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.wtf("AWWW CRAP", e.toString()); 
    } 
} 

(Es schreibt nicht entweder).

Leider hatte ich einige Probleme damit. Mein wichtigstes Problem ist, dass wenn es (in den Fällen, die es tut) ausgeführt wird, es tatsächlich nichts speichert. Ich gehe und überprüfe com.companyName.AppName.whatever/files Verzeichnis nur, um keine solche .png Datei zu finden. Ich werde es auch brauchen, um irgendwelche existierenden Dateien desselben Namens zu überschreiben, was schwer zu überprüfen ist, wenn es nicht funktioniert.

Mein zweites Problem ist, dass es Verzögerungen bei der Internetverbindung nicht berücksichtigt. Obwohl ich genug try-catch-Klauseln eingegeben habe, um zu verhindern, dass es abstürzt (wie früher), ist das Endergebnis, dass es auch nicht speichert.

Wie kann ich das verbessern? Alles was ich vermisse?

EDIT:

Druck aus dem Verzeichnis zeigt es in sein sollte: Allerdings

/data/user/0/com.appName/files/5965e9e4a0f0463853016e2b.png

, mit ES File Explorer, ist das einzige, was entfernt in der Nähe ist

emuliert/0/Android/data/com.appName/files/

Sind sie das gleiche Verzeichnis?

Antwort

0

versuchen, diese erste get Bitmap-Bild von url

Bitmap mIcon11 = null; 
try { 
    InputStream in = new java.net.URL(url).openStream(); 
    mIcon11 = BitmapFactory.decodeStream(in); 
} catch (Exception e) { 
    Log.d("Error", e.getStackTrace().toString()); 

} 

und Bitmap-Bild zu speichern überprüfen Sie bitte die ans derGoCrazy

+0

Der Link zeigt Ihnen um im externen Speicher zu speichern. Wie gehe ich mit der Verwendung von internem Speicher im Gegensatz zu extern vor? –

0

Versuchen Sie, diese

void getImage(String string_url) 
{ 
    //Generate Bitmap from URL 
    URL url_value = new URL(string_url); 
    Bitmap image = 
    BitmapFactory.decodeStream(url_value.openConnection().getInputStream()); 

    //Export File to local Directory 
    OutputStream stream = new FileOutputStream("path/file_name.png"); 
    /* Write bitmap to file using JPEG or PNG and 80% quality hint for JPEG. */ 
    bitmap.compress(CompressFormat.PNG, 80, stream); 
    stream.close(); 
} 
+0

Es funktioniert nicht, aus irgendeinem Grund. Aber ich habe die Frage aktualisiert, vielleicht könnte das etwas Licht ins Dunkel bringen. –

+0

https://stackoverflow.com/questions/3028306/download-a-file-with-android-and-showing-the-progress-in-a-progressdialog versuchen Sie dies, wenn etwas Hilfe sein könnte –

Verwandte Themen