Textdatei in internen Speicher downloaden

  • Antworten:170
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 93

11.04.2020, 09:09:30 via Website

Hallo Leute!

Eine Textdatei soll von einer URL heruntergeladen werden. In weiterer Folge möchte ich diese Textdatei zeilenweise auslesen und weiterverarbeiten (Zeilen mit 64 Zeichen pro Zeile).
Ich habe mir diverse Varianten angesehen. Das Downloaden habe ich mit Hilfe des Downloadmanagers schon mal geschafft. Es scheitert nun allerdings am Auslesen dieser Textdatei da ich nicht weiss wo ich da ansetzten soll. Ich habe nicht herausgefunden wo diese Datei gespeichert wird und wie ich darauf zugreifen kann. Anzumerken wäre noch, dass sich keine externe Speicherkarte im Gerät befindet. Da die Datei nur für eine Auswertung benötigt und in keiner anderen App verwendet wird, dachte ich an den internen Speicher.
Habe auch diverse Varianten mit FILE und SCANNER gesehen aber wo und wie ich wirklich anfangen soll ist mir leider nicht klar.

Wäre toll wenn mir jemand helfen könnte.

Schöne Ostern mal vorweg

Diskutiere mit!
Beste Antwort
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.800

13.04.2020, 00:25:03 via Website

Bedenke, dass wenn du die Datei downloadest, diese nicht überschrieben wird, wenn sie schon vorhanden ist!

Hier mal nen Code von mir:

private fun startDownloading() {
    File file = new File(getExternalFilesDir(null), "amateur.txt"); // NEU
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://www.celestrak.com/NORAD/elements/amateur.txt"));
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI || DownloadManager.Request.NETWORK_MOBILE);
    request.setTitle("Download");
    request.setDescription("Downloading File");
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationUri(Uri.fromFile(file)); // NEU
    //request.setDestinationInExternalPublicDir("/data/data/$packageName", "amatur.txt");
    DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
    manager.enqueue(request);
}

public void readFile() {
    if (isExternalStorageReadable()) {
        StringBuilder sb = new StringBuilder();
        try {
            File textFile = new File(getExternalFilesDir(null), "amateur.txt");
            FileInputStream fis = new FileInputStream(textFile);

            if (fis != null) {
                Log.i("myLog", "is not null");

                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader buff = new BufferedReader(isr);
                String line = null;

                while ((line = buff.readLine()) != null) {
                    sb.append(line + "\n");
                }
                fis.close();
            }
            Log.i("myLog", "setText");

            tvText.setText(sb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 471

11.04.2020, 09:48:25 via Website

Hallo!

Normalerweise lädt man die Datei direkt in die Anwendung. Und die Anwendung (bzw. der App-Hersteller) bestimmt wohin die Datei gespeichert wird, und ob die Datei dauerhaft oder nur temporär im Speicher verbleibt. Das Speichern und den Speicherort dem Betriebssystem zu überlassen ist m.E. keine gute Idee.

Aber wie speicherst Du bisher? Standard-Speicherfunktion? In Windows gibt es einen Standardpfad (%Userprofile%\AppData\Local\Temp), vielleicht gibt es ja in Android auch einen Standardpfad.

Gruß, René

— geändert am 11.04.2020, 09:53:42

Öffne Dein Herz und Du wirst die Welt sehen, öffne Deinen Geist und Du wirst sie verstehen.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

11.04.2020, 10:04:12 via Website

Mit der Downloadmanager Funktion wird die Datei heruntergeladen und ich kann sie am Gerät selbst auch öffnen und anzeigen. Ich möchte diese Datei jetzt aber in der App weiterverarbeiten. An diesem Zugriff scheiter es.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.219

11.04.2020, 11:51:09 via Website

Hallo
wo in welchen Speicher Bereich wird die Datei gespeichert?
Bitte erstmal der komplette Path.

auch die internen SD Karte braucht Permission.
interessant wäre auch die Android Version die du verwändest und willst.

— geändert am 11.04.2020, 12:18:30

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

11.04.2020, 13:11:25 via Website

Hi!

In welchen Speicherbereich das geladen wird würde mich selbst auch interessieren. Wie gesagt, der Download selbst wurde mit folgendem Code durchgeführt:

Downloadmanager.request request = new Downloadmanager.Request(Uri.parse(url));

Natürlich mit den ganzen permissions etc. Aber es wurde in dem Beispiel-Code kein default Verzeichnis festgelegt.
SDK Version 28

Es sollte so einfach wie möglich gelöst werden... Textdatei downloaden, in einem Verzeichnis speichern (egal wo, die Textdatei wird ohnehin bei jedem App-Start neu geladen bzw. durch manuelle Tätigkeit), Zeilenweise auslesen.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.219

11.04.2020, 13:54:17 via Website

und ich kann sie am Gerät selbst auch öffnen und anzeigen

Dann solltest du den Path auch kennen. sonst stimmt deine Aussage nicht.

Zeige doch mal wie du es runter lädst.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

11.04.2020, 14:43:44 via Website

Hab da was falsch interpretiert. Es ist schon das Downloadverzeichnis ausgewählt. Nämlich hier:

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,""+fileName);

Hier der ganze Code mit dem Versuch, die Textdatei per File auszulesen und in in ein TextView zu übergeben.

public class MainActivity extends AppCompatActivity {

private static final int PERMISSION_STORAGE_CODE = 1000;
Button btnDownload;
Button btnRead;
TextView tvText;
String url = "https://www.celestrak.com/NORAD/elements/amateur.txt";
String fileName = "amateur.txt";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnDownload = findViewById(R.id.btnDownload);
    btnRead = findViewById(R.id.btnRead);
    tvText = findViewById(R.id.tvText);

    btnDownload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
                    String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
                    requestPermissions(permissions, PERMISSION_STORAGE_CODE);
                }
                else{
                    startDownloading();
                }
            }
            else{
                startDownloading();
            }
        }
    });

    btnRead.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                File file = new File(fileName);
                Scanner scanner = new Scanner(file);
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine();
                    tvText.setText(line);
                }
                scanner.close();
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            }
        }
    });

}

private void startDownloading() {
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
    request.setTitle("Download");
    request.setDescription("Downloading File");
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,""+fileName);
    DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
    manager.enqueue(request);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch(requestCode){
        case PERMISSION_STORAGE_CODE:{
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                startDownloading();
            }
            else{
                Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show();
            }
        }
    }
}

}

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.219

11.04.2020, 15:04:10 via Website

Der Path der Datei sollte dieser sein.
/storage/emulated/0/Android/data/deinPackageName/files/Download/deineDatei
Da für brauchst du eigentlich keine Premission.

String path = Environment.getExternalStorageDirectory() +
"/Android/data/" + getPackageName() + "/files/Download/" + fileName;

String dirPath = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();

Das lesen aus der Datei wird wohl auch nicht richtig gehen.

https://www.programmierenlernenhq.de/tutorial-android-daten-in-datei-speichern/

— geändert am 11.04.2020, 15:27:57

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

11.04.2020, 15:21:55 via Website

Hab's mal versucht und den Pfad bei new File(Environment.....) eingegeben aber da wird mir dann trotzdem nichts im TextView ausgegeben. Ich finde die Textdatei aber zumindest im Download Ordner am Gerät selbst. Mal sehen ob diese Methode überhaupt das tut was sie soll...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

12.04.2020, 23:11:30 via Website

Habe jetzt einiges versucht und nichts hat zum Ziel geführt.

Letzter Stand sieht wie folgt aus:

Datei Downloaden: request.setDestinationInExternalPublicDir(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)),"amateur");
DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

Datei lesen:

public void readFile() {
    //String data = "";
    //StringBuffer sBuffer = new StringBuffer();
    if (isExternalStorageReadable()) {
        StringBuilder sb = new StringBuilder();
        try {
            File textFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsoluteFile(), "amateur.txt");

FileInputStream fis = new FileInputStream(textFile);

            if (fis != null) {
                Log.i("myLog", "is not null");

                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader buff = new BufferedReader(isr);
                String line = null;

                while ((line = buff.readLine()) != null) {
                    sb.append(line + "\n");
                }
                fis.close();
            }
            Log.i("myLog", "setText");

            tvText.setText(sb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

FileInputStream scheint null zu sein da mir Log nicht ausgegeben wird... Irgendeine Idee was ich da falsch mache?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

12.04.2020, 23:28:17 via Website

War leider nur ein Tippfehler hier im Forum. Die Dateinamen sind beide ident im Code.

Hilfreich?
Diskutiere mit!
Beste Antwort
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.800

13.04.2020, 00:25:03 via Website

Bedenke, dass wenn du die Datei downloadest, diese nicht überschrieben wird, wenn sie schon vorhanden ist!

Hier mal nen Code von mir:

private fun startDownloading() {
    File file = new File(getExternalFilesDir(null), "amateur.txt"); // NEU
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://www.celestrak.com/NORAD/elements/amateur.txt"));
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI || DownloadManager.Request.NETWORK_MOBILE);
    request.setTitle("Download");
    request.setDescription("Downloading File");
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationUri(Uri.fromFile(file)); // NEU
    //request.setDestinationInExternalPublicDir("/data/data/$packageName", "amatur.txt");
    DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
    manager.enqueue(request);
}

public void readFile() {
    if (isExternalStorageReadable()) {
        StringBuilder sb = new StringBuilder();
        try {
            File textFile = new File(getExternalFilesDir(null), "amateur.txt");
            FileInputStream fis = new FileInputStream(textFile);

            if (fis != null) {
                Log.i("myLog", "is not null");

                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader buff = new BufferedReader(isr);
                String line = null;

                while ((line = buff.readLine()) != null) {
                    sb.append(line + "\n");
                }
                fis.close();
            }
            Log.i("myLog", "setText");

            tvText.setText(sb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

13.04.2020, 07:47:45 via Website

Works like a charm!! Danke vielmals!!
Ist es auch möglich die Datei jedesmal einfach zu überschreiben mit dem gleichen Dateinamen? Das wäre noch sehr sinnvoll da diese Textdatei in nicht regelmäßigen Abständen aktualisiert wird.

Hilfreich?
Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.800

13.04.2020, 10:14:43 via App

Moin,

ich gebe dir die Denkanstöße und du probierst alleine 😉

  • prüfe ob die Datei existiert
    • wenn ja - löschen

    • wenn nein - Datei downloaden
  • lese die Datei

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 93

16.04.2020, 09:30:42 via Website

Ich bin wieder auf Probleme gestoßen... Nachdem ich den Code in mein eigentliches Projekt implementiert habe, stürzt mir die App beim Versuch die Textdatei auszulesen immer ab. Ich finde die heruntergeladene Textdatei auch nicht mehr im Downloads Ordner wie am Anfang. Wüsste jetzt nicht was ich geändert haben soll.

Aufruf in der MainActivity:

ReadTxtfile readTxtFile = new ReadTxtfile();
readTxtFile.readFile();

ReadTxtFile():

public class ReadTxtFile extends AppCompatActivity {

private String TLE1;
private String TLE2;
private String TLE3;
String threeLineElement;

private void ReadTxtFile(){

    this.TLE1 = TLE1;
    this.TLE2 = TLE2;
    this.TLE3 = TLE3;
    this.threeLineElement = threeLineElement;
}

private String getTLE1() {return TLE1;}
private String getTLE2() {return TLE2;}
private String getTLE3() {return TLE3;}
private String getThreeLineElement() {return threeLineElement;}

// READ TLE-SAT DATA FILE
public void readFile() {
    if (isExternalStorageReadable()) {
        StringBuilder sb = new StringBuilder(69);
        try {
            File textfile = new File(getExternalFilesDir(null), "amateur.txt");
            FileInputStream fis = new FileInputStream(textfile);

            if (fis != null) {
                InputStreamReader isr = new InputStreamReader(fis);
                BufferedReader buff = new BufferedReader(isr);
                String line = null;
                //int lineNr = 0;

                while ((line = buff.readLine()) != null) {
                    sb.append(line + "\n");
                    //lineNr++;
                }
                fis.close();
            }

            String[] sbLines = sb.toString().split("\n");
            TLE1  = sbLines[0];
            Log.d("myLog","TLE1: "+TLE1);
            TLE2 = sbLines[1];
            Log.d("myLog","TLE2: "+TLE2);
            TLE3 = sbLines[2];
            Log.d("myLog","TLE3: "+TLE3);} catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private boolean isExternalStorageReadable() {
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState())) {
        Log.i("State", "Is readable!");
        return true;
    }
    else {
        return false;
    }
}

}

Wenn ich den Fehler nicht falsch interpretiere so meckert er weil diese Textdatei nicht gefunden wird oder irre ich mich? Jedenfalls wird die Datei heruntergeladen, nur wie greife ich auf diese jetzt zu?

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getExternalFilesDir(java.lang.String)' on a null object reference

Hilfreich?
Diskutiere mit!
Empfohlene Artikel bei NextPit