odczyt pliku tekstowego z lokalizacji DOWNLOADS

0

Cześć

Szukam rozwiązania problemu z odczytem pliku tekstowego z lokalizacji storage/emulated/0/download.
Przeszukałem już dziesiątki stron i w sumie kod wygląda podobnie a cały czas nie mogę odczytać pliku.

Do manifestu dodałem:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

co ponoć ma wpłynąć na uprawnienia do odczytu i zapisu.

na chwilę obecną mam coś takiego i program nie jest w stanie dojść do linii Toast..... load = ok

    public void load(View v) {
        try {
            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            File myFile = new File(path, "/ftp/bazy/bazamasymetali.txt"); //nazwa pliku i path finalny
            FileInputStream fis = new FileInputStream(myFile);
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            Toast.makeText(getApplicationContext(),"load = ok",Toast.LENGTH_LONG).show();
            //while ((strLine = br.readLine()) != null) {
            //    myData = myData + strLine;
            //}
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),"error1: " + e.toString(),Toast.LENGTH_LONG).show();
        }
    }

otrzymuję odpowiedz e.toString()

EACCES: permission denied

w uprawnieniach aplikacji jest ustawiony
Mają dostęp >> pamięć / pozwolenie na dostęp tylko do multimediów

możecie mnie jakoś naprowadzić na przyczynę problemu?

0

Na Androidzie 11 powinno być

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

Może to jest problem

EDIT
Jest jeszcze taka opcja "obejścia" ale podobno już nie działa:

  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
0

No i nic nie pomogło, z tego co pamiętam to już to rozwiązanie gdzieś widziałem.
Może to w czymś innym jest problem?
Od wielu lat piszę w .NET więc sama java dla mnie to masakra a co dopiero android... :P
Najgorsze jest to że nawet w tutorialach na YT wszystko gościom działa, przepiszę słowo w słowo i u mnie padaka :[

Może to pomoże, zapis w pliku w folderze "obok" realizuję tak i działa.

 public void save(View v) {
Long tsLong = System.currentTimeMillis()/1000;
        String ts = tsLong.toString();
        try {
            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            File myFile = new File(path, "/ftp/android/" + ts + ".txt"); //nazwa pliku i path finalny
            FileOutputStream fOut = new FileOutputStream(myFile,true);
            OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);

            myOutWriter.append("test zapisu" + "\n"); //dane z pliku
            myOutWriter.append(etInput.getText().toString() + "\n"); //dane z pliku
            myOutWriter.append("linia 2"); //dane z pliku

            myOutWriter.close();
            fOut.close();
            Toast.makeText(this,"wysłano polecenie",Toast.LENGTH_LONG).show();
        }
        catch (java.io.IOException e) {
            Toast.makeText(this,"ERROR - problem z zapisem pliku" ,Toast.LENGTH_LONG).show();
        }
    }
0

Jedno słowo, które rozwiąże wszystkie twoje problemy - FLUTTER ;-)

0

słowo ładne, a coś więcej?

To jest podobne słowo do Xamarin?

0

Nieeee, włącz sobie Youtube i sprawdź. Ja tylko proponuje czego powinno się uczyć w kwestii mobilek ;-)

0

Powiem tak, kiedyś dość popularnym jerzykiem był vb.net, Pamiętam jak zaczynałem się go uczyć to nikt nie miał w planie go degradować. W chwili obecnej jest to już język który nie jest wspierany przez najnowsze rozwiązania. Zmierzam do tego że pojęcia nie mamy w czym będzie się pisało za 5-10 lat. Obecnie java jest na topie i raczej się utrzyma. Co za tym idzie chciałbym rozwiązać mój problem w java/android a nie w dart/android ;)

Myślałem o Xamarin, żeby jakoś tego uniknąć, następnie Azure i takie tam pierdy gdzie też ponoć można cuda robić w vb.net i instalować na androidzie.
Nie chcę już szukać obejścia tego problemu i trzeba siąść do javy i tyle, nic nie poradzę.

Chciałbym wrócić do tematu, chyba że telefony z androidem nie są w stanie wykonać operacji odczytania pliku z folderu external. :D

2

Problem polega na tym pewnie, że próbujesz rozwiązać swój problem od tyłka strony. Są do tego odpowiednie biblioteki. Nikt nie zapisuje w ten sposób danych i to jeszcze do .txt. Ciężko się pomaga jak ma się tylko skrawek informacji. W przypadku androida to jest trochę rzeczy na które trzeba zwrócić uwagę:

  1. SDK - jaka wersja
  2. manifest - jakie uprawnienia
  3. Telefon - czy zezwoliłeś w telefonie na te uprawnienia
  4. Zapis pliku - czy funkcja którą zapisujesz plik tworzy automatycznie podfoldery

PS.
Wrzuć link do tutoriala, z którego to pisałeś.

0

build.gradle

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.example.salo"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.salo">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SaLo">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

w telefonie wszystkie co chciało dostało dostęp.

nie, jeśli folder nie istnieje to try wywala błąd, jak dla mnie nie jest to wymagane na chwilę obecną.
Gdzieś miałem już zapisana funkcje do tworzenia folderów, 3-4 linie, i fajnie działa, tworzy nawet w lokalizacjach external.

Tyle wiem, jak na razie nie ukrywam cieno idzie ale tu liczę na Waszą wiedzę ;)

0

Environment.getExternalStoragePublicDirectory jest depricated w API 30. Uczysz się starego tutoriala programując na nowe urządzenie. Ja nie piszę w Javie na mobilki, więc ciężko mi ciebie nakierować co masz zmienić.

getExternalFilesDir
Environment.getExternalStorageDirectory() deprecated in API level 29 java

0

rozumiem że piszesz w dart, to w takim razie możesz mnie przekonać do odejścia od javy.
jak pokażesz mi jak napisać aplikację wykonującą trzy czynności, resztę już sobie powoli rozkminię
zapis i odczyt pliku z lokalizacji zewnętrznej oraz odczyt tagu nfc :P
plik musi być w .txt bo taki format odbiera aplikacja dla której te pliki są przeznaczone.

0

Aż tak mi nie zależy żebyś pisał w Dart :D good luck

0

hehe, dzięki za pomoc, 3m się

0

Ok, rozkminiłem temat i wygląda na to że znalazłem rozwiązanie jakie mnie zadowoliło.

Z tego co się doczytałem to wersja SDK 30 ma bardziej rozbudowany system zabezpieczeń związany z odczytem danych przez aplikację.
Ponoć da się to obejść wywołując nadawanie uprawnień zaraz przed pobraniem pliku z pamięci. Ale słabo mi to wychodziło a w sumie to nie wychodziło :P
To nie mój level jak na razie :D

Rozwiązałem to w następujący sposób.
File -> Project Structure -> Moduls -> Default Config

i tu w Target SDK Version zmieniłem na API 28
Następnie w build.gradle musiałem dodać taki wpis "//noinspection ExpiredTargetSdkVersion" nad "targetSdkVersion 28".
teraz jak aplikacja pyta o uprawnienia to tylko raz i następnie normalnie odczytuje pliki z folderu Download.
W sumie to zmieniłem typ pliku z .txt na .csv i dane mam już w formie tablicy.
Odczyt wykonałem poprzez CSVReader.

minSdkVersion 23
//noinspection ExpiredTargetSdkVersion
targetSdkVersion 28

Może komuś się to przyda, na Samsung Android 9,10,11 śmiga, Pozdrawiam ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1