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?
Der Link zeigt Ihnen um im externen Speicher zu speichern. Wie gehe ich mit der Verwendung von internem Speicher im Gegensatz zu extern vor? –