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
  • Admin
  • Forum-Beiträge: 7.887

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.☺

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

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

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.435

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.435

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.435

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
  • Admin
  • Forum-Beiträge: 7.887

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.☺

Lebensmittelwarnung-App

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
  • Admin
  • Forum-Beiträge: 7.887

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.☺

Lebensmittelwarnung-App

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!
  • Forum-Beiträge: 1.435

16.04.2020, 09:42:16 via Website

Hallo du willst prüfen ob die Datei existiert. Tust du aber nicht sondern du prüfst ob der inputStream existiert.

Die Datei ist das textFile Objekt.

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

16.04.2020, 09:47:48 via Website

Hab mal ein Log eingebaut, es wird mir aber nichts angezeigt im logcat

                if(textfile != null) {

                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();
                }
            }
            else{
                Log.i("mylog","File not found");
            }
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.435

16.04.2020, 09:58:19 via Website

du willst doch Downloaden und nicht lesen warum dann ein Inputstream und nicht OutPut.
du willst doch in das FileSystem schreiben.

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

16.04.2020, 10:02:18 via Website

Hmm.. Aber die Downloadmethode befindet sich in der MainActivity:

private void startDownloading() {
    File file = new File(getExternalFilesDir(null), "amateur.txt");
   /* if(file.exists()){
        file.delete();
        Log.i("myLog", "File deleted");
    }*/

    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); //VISIBILITY_HIDDEN
    request.setDestinationUri(Uri.fromFile(file));
    DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
    manager.enqueue(request);
}

Die Datei wird so auch heruntergeladen und ich kann sie über das Notify öffnen (Standardapp zum Öffnen wird abgefragt). Danach ist sie aber verschwunden bzw. ich kann sie nicht finden.

— geändert am 16.04.2020, 10:07:21

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

16.04.2020, 10:20:50 via Website

wenn du sie mit Android Bord Mitteln öffnen und ansehen kannst und sie danach weg ist hast du sie wohl gelöscht.

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

16.04.2020, 10:28:24 via Website

if(textfile != null) {

wird auch nicht gehen die Instanz abzufangen macht keinen Sinn.

if(textfile.isFile())

if(textfile.exists())

könnte mehr Sinn machen.

— geändert am 16.04.2020, 10:46:58

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

16.04.2020, 10:32:30 via Website

Habe mit dem onboard Dateimanager nach der Datei gesucht. Sie wird unter /Interner Speicher/Android/data/com.example.meinapp/files/amateur.txt gespeichert. Soll ich diesen Pfad eingeben?

File textfile = new File(getExternalFilesDir(null), "/Interner Speicher/Android/data/com.example.meinapp /files/amateur.txt");
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.435

16.04.2020, 10:43:47 via Website

getExternalFilesDir(null); ist genau der Path
schaue es dir an mit

String st = context.getExternalFilesDir(null).getAbsolutePath();

File textfile = new File(getExternalFilesDir(null).getAbsolutePath(), "amateur.txt");

— geändert am 16.04.2020, 11:08:24

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

16.04.2020, 11:01:22 via Website

Public constructors

File(String pathname)
Creates a new File instance by converting the given pathname string into an abstract pathname.

File(String parent, String child)
Creates a new File instance from a parent pathname string and a child pathname string.

File(File parent, String child)
Creates a new File instance from a parent abstract pathname and a child pathname string.

File(URI uri)
Creates a new File instance by converting the given file: URI into an abstract pathname.

Hilfreich?
Diskutiere mit!
Ludy
  • Admin
  • Forum-Beiträge: 7.887

16.04.2020, 12:17:58 via App

Moin,

poste bitte die komplette Activity. Mein Tip ist, du hast die Methode/Funktion außerhalb von onCreate initialisiert

Gruß Ludy (App Entwickler)

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

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

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

16.04.2020, 12:26:55 via Website

Hier mal die oncreate:

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

    objCoordToLoc = new CoordToLoc();
    tv_qth_on_main_activity=findViewById(R.id.tv_qth_on_main_activity);

    //Download latest TLE-DATA
    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();
    }

    //Get GPS-Coordinates
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

    //Main Toolbar
    toolbar = findViewById(R.id.myToolbar);
    setSupportActionBar(toolbar);

    // MENU ENTRIES MAIN MENU
    list = findViewById(R.id.list1);
    MyAdapter adapter = new MyAdapter(this, titles, imgs);
    list.setAdapter(adapter);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (position == 0){
                Intent intent1 = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(intent1);
            }
            if (position==1) {
                Intent intent2 = new Intent(MainActivity.this, HelpActivity.class);
                startActivity(intent2);
            }
            if (position==2) {
                Intent intent3 = new Intent(MainActivity.this, HamSatMenu.class);
                startActivity(intent3);
            }
            if (position==3) {
                Intent intent3 = new Intent(MainActivity.this, HelpActivity.class);
                startActivity(intent3);
            }
            if (position==4) {
                Intent intent3 = new Intent(MainActivity.this, HelpActivity.class);
                startActivity(intent3);
            }

        }
    });


    // SharedFunctions.obs_lat = latitude;
    // SharedFunctions.obs_lon = longitude;
    // SharedFunctions.obs_lat = roundToDecimals(latitude, 4);
    // SharedFunctions.obs_lon = roundToDecimals(longitude, 4);

    SharedFunctions.qth_stnname = "PATRICK";
    SharedFunctions.qth_stnlat  = 56.8582;
    SharedFunctions.qth_stnlon  = 14.7662; //Double.parseDouble(longitude)
    SharedFunctions.qth_stnalt  = altitude;
    // SharedFunctions.qth_stnlat  = latitude;
    // SharedFunctions.qth_stnlon  = longitude;

    SharedFunctions.obs_geodetic_lat   =  latitude * SharedFunctions.deg2rad;    // Observer's latitude in radians
    SharedFunctions.obs_geodetic_lon   = longitude * SharedFunctions.deg2rad;    // Observer's longitude in radians
    SharedFunctions.obs_geodetic_alt   =  0.18;       // Observer's altitude in km

    String tempval_str = "";

    /***
     * TLE MANUELL IMPORTIEREN
     */

    TleManualImport tleFunction = new TleManualImport();


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


    String tleElement = readTxtFile.threeLineElement;
    //String tleElement = "SAUDISAT 1C (SO-50)\n" +
     //       "1 27607U 02058C   20106.54414103  .00000007  00000-0  21737-4 0  9999\n" +
      //      "2 27607  64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";

    String[] SatData = tleFunction.processTLE(tleElement); //tleElement


    SharedFunctions.sat_name = SatData[0];                         // name
    SharedFunctions.sat_catnum = Long.parseLong(SatData[2]);       // catalog number
    SharedFunctions.sat_designator = SatData[3];                   // class
    SharedFunctions.sat_year = Integer.valueOf(SatData[7]);        // epochyear

    try {
        SharedFunctions.sat_refepoch = Double.parseDouble(SatData[8]); // epochday
        SharedFunctions.sat_drag = Double.parseDouble(SatData[9]);     // ftdmm
        /* if(!TextUtils.isEmpty(SatData[10])){
            SharedFunctions.sat_nddot6 = Double.parseDouble(SatData[10]);  // stdmm which is usually 0000-0 interpreted to decimal somehow
        } */

        // Enter 'drag' (Bstar Drag Parameter, EEEEE-E) as follows:
        // TLE provides: 17950-3   enter in database: -0.00017950
        // We just assume the value is always negative..??
        int exponent = Integer.parseInt( SatData[11].substring(SatData[11].length()-2) );
        String tempvalue = SatData[11].substring(0, 1) + "." + SatData[11].substring(1, 6);
        double dragvalue = Double.valueOf(tempvalue);
        dragvalue = dragvalue * 0.001;
        SharedFunctions.sat_bstar = dragvalue;

        SharedFunctions.sat_incl = Double.parseDouble(SatData[17]);    // incl
        SharedFunctions.sat_raan = Double.parseDouble(SatData[18]);    // ra
        SharedFunctions.sat_eccn = Double.parseDouble("0."+SatData[19]);    // ecc
        SharedFunctions.sat_argper = Double.parseDouble(SatData[20]);  // peri
        SharedFunctions.sat_meanan = Double.parseDouble(SatData[21]);  // ma
        SharedFunctions.sat_meanmo = Double.parseDouble(SatData[22]);  // mm

    } catch (NumberFormatException e) {
        // Handle error here, perhaps notify the user to input some data
        Toast.makeText(this,"Error! " + e, Toast.LENGTH_LONG).show();

    }

    // For some reason the orbit number sometimes has a leading space in the database field.
    // This causes the error: NumberFormatException.
    // Here I use a temporary string that holds the database value and then use trim()
    // to remove any leading and/or trailing spaces so the conversion doesn't throw an error.
    // This hack is also used in SatPredict

    tempval_str = SatData[23];  // revnr
    tempval_str=tempval_str.trim();
    SharedFunctions.sat_orbitnum = Long.parseLong(tempval_str);

    SharedFunctions.tle_sat_name = SharedFunctions.sat_name;
    SharedFunctions.tle_idesg    = SharedFunctions.sat_designator;
    SharedFunctions.tle_catnr    = (int) SharedFunctions.sat_catnum;
    SharedFunctions.tle_epoch    = (1000.0*(double)SharedFunctions.sat_year)+SharedFunctions.sat_refepoch;
    SharedFunctions.tle_xndt2o   = SharedFunctions.sat_drag;
    SharedFunctions.tle_xndd6o   = SharedFunctions.sat_nddot6;
    SharedFunctions.tle_bstar    = SharedFunctions.sat_bstar;
    SharedFunctions.tle_xincl    = SharedFunctions.sat_incl;
    SharedFunctions.tle_xnodeo   = SharedFunctions.sat_raan;
    SharedFunctions.tle_eo       = SharedFunctions.sat_eccn;
    SharedFunctions.tle_omegao   = SharedFunctions.sat_argper;
    SharedFunctions.tle_xmo      = SharedFunctions.sat_meanan;
    SharedFunctions.tle_xno      = SharedFunctions.sat_meanmo;
    SharedFunctions.tle_revnum   = (int) SharedFunctions.sat_orbitnum;

    /*final TextView SingleTrackText = (TextView)  this.findViewById(R.id.SingleTrackText);
    SingleTrackTime    = (TextView)  this.findViewById(R.id.SingleTrackTime);
    SatAz              = (TextView)  this.findViewById(R.id.AziText);
    SatEl              = (TextView)  this.findViewById(R.id.EleText);
    SatDetails         = (TextView)  this.findViewById(R.id.SatDetails);
    AosInfo            = (TextView)  this.findViewById(R.id.AosInfo);
    */

    if (sf.Geostationary()==1)
    {
        //SatDetails.setText("\n\nGeostationary satellites cannot be tracked in Realtime!\n");

    } else {

        //SatDetails.setText("Loading data..\n\n\n");

        //SingleTrackText.setText("\n" + SharedFunctions.tle_sat_name + " (" + SharedFunctions.tle_catnr + ")");

        // initializing and starting a new local Thread object

        /**
         * MODIFIED Thread currentThread = new Thread(this);
         */
        Thread currentThread = new Thread((Runnable) this);

        currentThread.start();


    } // end-if when object is non-geostationary

}

— geändert am 16.04.2020, 12:30:10

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

16.04.2020, 13:45:00 via Website

Hallo habe es nur überflogen. Das ist doch die onCreate der mainactivity wo du es downloadest.
Du sagst der download ist OK und die Datei ist da.

Was Ludy wollte ist die die Klasse wo du es lesen willst.

Frage von mir, ist zu dem Zeitpunkt wo du lesen willst die Datei schon fertig runter geladen? Der download auch abgeschlossen.?

— geändert am 16.04.2020, 13:54:28

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

16.04.2020, 13:57:36 via Website

Bin gerade nicht zu Hause, poste den Code etwas später. Ob der Download fertig ist wäre im Grunde egal da die zuvor geladene Datei gespeichert bleibt und wenn vorhanden so wird automatisch ein anderer Dateiname für die neue Datei erzeugt (amateur-01.txt)

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

16.04.2020, 14:03:19 via Website

Ganz egal ist es nicht und wenn die Datei gerade wegen einem Download von System gesperrt ist. Und einen andreren Namen hat brauchst du dich nicht wundern.

Ist denn das prüfen auf Existenz der Datei vor dem Lesen erfolgreich.
Vor dem Lesen.

Dein prüfen war falsch habe ich dir schon gesagt.

— geändert am 16.04.2020, 14:06:19

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

16.04.2020, 14:09:59 via Website

Hier der Code:

public class ReadTxtFile extends AppCompatActivity {

Context context;

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");
            //String st = context.getExternalFilesDir(null).getAbsolutePath();
            //Log.i("myLog","Path: "+st);
            File textfile = new File(getExternalFilesDir(null).getAbsolutePath(), "amateur.txt");
            FileInputStream fis = new FileInputStream(textfile);

            if(textfile.isFile()) {

                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();
                }
            }
            else{
                Log.i("mylog","File not found");
            }

            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);
            //SharedFunctions.threeLineElement = TLE1 + "\n" + TLE2 + "\n" + TLE3 + "\n";
            //Log.d("myLog","threeLineElement: "+SharedFunctions.threeLineElement);
            //threeLineElement = "SAUDISAT 1C (SO-50)\n" +
            //        "1 27607U 02058C   20106.54414103  .00000007  00000-0  21737-4 0  9999\n" +
            //        "2 27607  64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";
            //tvHamSatMenu.setText(sbLines[3]);
            //tvTestBox.setText(line[3]);
            //char test = sb.charAt(3);
            //String sTest = String.valueOf(test);
            //tvTestBox.setText(sb);
        } 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;
    }
}

}

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

16.04.2020, 15:32:12 via Website

Hallo ist das wirklich die kompette Activity ? keine onCreate ?
Kein layout? .....

Das Prüfen würde ich auch nach dem erstellen des textfile Objektes machen.
wenn es das nicht gibt brauchst du auch nicht lesen.

File textfile = new File(getExternalFilesDir(null).getAbsolutePath(), "amateur.txt");
if(textfile.exists()) {

        FileInputStream fis = new FileInputStream(textfile);

.......

Noch etwas ein Konstruktor in einer Activity ist sinnlos. Der wird selber erstellt von der IDE.

— geändert am 16.04.2020, 15:36:28

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

16.04.2020, 15:38:40 via Website

Nein, keine onCreate und kein Layout. Soll nur diese Funktion ausführen.
Leider hat die Änderung im Code auch keine Abhilfe geschaffen... Vielleicht sollte ich wirklich alles in der MainActivity belassen...
Mich wundert es nur, dass in meinem Beispielprojekt indem nur Download und Auslesen der Datei erfolgte, die Ausgabe in ein TextView tadellos funktioniert hat.

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

16.04.2020, 15:57:30 via Website

jetzt verstehe ich was du machst.
das ist keine Activity.
Die Klasse müsste gar nicht von Actiivity Erben "extends AppCompatActivity"

Du bist noch in der MainActivty hast eigentlich nur ein Objekt der Klasse erstellt.
Wenn du so etwas machst übergebe der Kasse den Context der Activity und auch die drei Parameter die du im Kostrucktor setzen willst.

Du hast in der Kasse gar keinen Bezug zum Dateisystem.

Wen es eine Richtige Activity wäre würde es gehen aber dann müsstest du sie auch in der Main mit einem Intent starten was du sicherlich nicht tust.

Lasse das extendet weg und du wirst sehen das du nichts mehr hast wenn du den Context nicht hast.

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

das ist der Aufruf aus deiner MainActivity . das ist kein start eine Activity sonder nur ein erzeugen eines Objektes.

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

16.04.2020, 16:04:52 via Website

public class ReadTxtFile  {

private String TLE1;
private String TLE2;
private String TLE3;
private Context context;
String threeLineElement;

private void ReadTxtFile(Context c, String TLE1, String TLE2, String TLE3 ){
this.context = c;
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");
//String st = context.getExternalFilesDir(null).getAbsolutePath();
//Log.i("myLog","Path: "+st);
File textfile = new File(context.getExternalFilesDir(null).getAbsolutePath(), "amateur.txt");
if(textfile.exists()) {

        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();
            }
        }
        else{
            Log.i("mylog","File not found");
        }

        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);
        //SharedFunctions.threeLineElement = TLE1 + "\n" + TLE2 + "\n" + TLE3 + "\n";
        //Log.d("myLog","threeLineElement: "+SharedFunctions.threeLineElement);
        //threeLineElement = "SAUDISAT 1C (SO-50)\n" +
        //        "1 27607U 02058C   20106.54414103  .00000007  00000-0  21737-4 0  9999\n" +
        //        "2 27607  64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";
        //tvHamSatMenu.setText(sbLines[3]);
        //tvTestBox.setText(line[3]);
        //char test = sb.charAt(3);
        //String sTest = String.valueOf(test);
        //tvTestBox.setText(sb);
    } 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;
}
}

}

— geändert am 16.04.2020, 16:27:51

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

16.04.2020, 16:19:04 via Website

Ja genau. Hätte ich erwähnen sollen, sorry

ja genau und genau deshalb geht es auch nicht. Ohne Context der Activity geht das nicht du bekommst nie den richtigen Path.

uns was von Activity erzählen und aber gar keine haben.

Ich denke du solltest die die Grundlagen von OOP noch mal ansehen.
Vererbung und einfache Kassen Instanzen . Auslagern von Code in externe Klassen.

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

16.04.2020, 16:31:40 via Website

Tipp wenn du in der Externen Klasse auf ein View Element zugreifen willst.
Musst du es auch wieder neu mit Hilfe des Context und findviewbyid suchen.

Hilfreich?
Diskutiere mit!
Ludy
  • Admin
  • Forum-Beiträge: 7.887

16.04.2020, 16:59:20 via Website

Moin,

das wird hier nie was, denn der String ist NULL und somit NullPointerException

String tleElement = readTxtFile.threeLineElement;

Deine Programmierung ist sehr schwer nachzuvollziehen. 😥

— geändert am 16.04.2020, 17:03:18

Gruß Ludy (App Entwickler)

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

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

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

16.04.2020, 17:18:50 via Website

Danke @Ludy die fünfte Variable habe ich vergessen ihn in den Konstruktor einzufügen.

Verstehe auch nicht warum man das in eine eigene Klasse schreiben muss.
Na ja das ist wohl sein Stiel.

Wie ich schon sagte ist der Hauptgrund das er von einer Activity spricht aber gar keine hat. Sondern eine Klasse die nur sinnloser weise davon erbt. Und somit keinen Context hatte.

private void ReadTxtFile(Context c, String TLE1, String TLE2, String TLE3 , String threeLineElement ){

— geändert am 16.04.2020, 17:33:20

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

16.04.2020, 17:44:27 via Website

eigentlich versucht er hier die Variable zu setzen ist aber ausgekammert

//threeLineElement = "SAUDISAT 1C (SO-50)\n" +
// "1 27607U 02058C 20106.54414103 .00000007 00000-0 21737-4 0 9999\n" +
// "2 27607 64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";

auch die anderen will er in dem Code setzen somit müsste er nur den Context übergeben.

Wenn das default sein soll würde ich das im Konstruktor machen.

— geändert am 16.04.2020, 17:46:54

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

16.04.2020, 17:54:20 via Website

public class ReadTxtFile  {

private String TLE1;
private String TLE2;
private String TLE3;
private Context contect;
String threeLineElement;

private void ReadTxtFile(Context c ){
this.context = c;
this.TLE1 = "";
this.TLE2 = "";
this.TLE3 = "";
this.threeLineElement = "SAUDISAT 1C (SO-50)\n" +
"1 27607U 02058C 20106.54414103 .00000007 00000-0 21737-4 0 9999\n" +
"2 27607 64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";

}

in der Activity also in der onCreate

ReadTxtFile readTxtFile = new ReadTxtFile(this);
readTxtFile.readFile();

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

16.04.2020, 18:00:21 via Website

Hier habe ich die Variable testweise gesetzt. Die geladene Txt-Datei besteht aus sagen wir 100 Zeilen im Stil

"SATNAME 1C (SO-50)\n" +
"1 27607U 02058C 20106.54414103 .00000007 00000-0 21737-4 0 9999\n" +
"2 27607 64.5556 206.7081 0055918 193.7297 166.2289 14.75625318931442\n";

Ich benötige jeweils immer drei Zeilen in einem String um die Daten anschließend auswerten zu können. Den Code für die Auswertung habe ich übernommen. Eigentlich würde ich dann sowas benötigen:

  1. String Zeile[0-2]
  2. String Zeile[3-5] jeweils aus der Textdatei amateur.txt
  3. String Zeile[6-8]
    usw.

Jeden einzelnen dieser Strings möchte ich an die Klasse, oder besser gesagt an die Methode "processTle" der Klasse TleManualImport übergeben. Dann wird jeder einzelne String ausgewertet und die Methode liefert mir einen String zurück den ich dann in der MainActivity wieder benötige.

So im Groben und Ganzen soll es aussehen

— geändert am 16.04.2020, 18:04:21

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

16.04.2020, 18:06:09 via Website

wo ist den diese Methode?

da wirst du dir wohl eine sinnvolle schleife bauen müssen . Das Statisch zumachen finde ich nicht gut.

Eigentlich liest du das alles schon in der while schleife in deinen StringBuilder.
Warum machst du da nicht gleich weiter?

Speicherst das in eine ArrayListe und gibst die weiter.

— geändert am 16.04.2020, 18:12:39

Hilfreich?
Diskutiere mit!