Schreiben auf externe Sdkarte

  • Antworten:17
Jokel
  • Forum-Beiträge: 1.530

08.05.2018, 22:17:05 via Website

Hallo Gemeinde.
Ich möchte eine Datei auf die externe Sdkarte schreiben ich meine nicht die internen emulirte Karte.
Lesen ist kein Problem. Das erstellen eines Verzeichnisses oder einer Datei schlägt leider fehl.
Vielen Dank im voraus.

Kommentieren
Erwin W.
  • Forum-Beiträge: 35.443

08.05.2018, 22:18:57 via App

welches Handy?
welche Android Version?

L.G. Erwin
..................
Wissen ist Macht. Nichts wissen macht nichts.
Wer einen Rechtschreibfehler findet darf ihn behalten.
Am Ende wird alles gut. Und wenn es nicht gut ist, ist es nicht das Ende.
Hat dir mein Beitrag gefallen? Dann würde ich mich über ein Danke freuen.
(cool)

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

09.05.2018, 00:06:51 via Website

Er meint wohl die Umsetzung als Quellcode.

Die Karten sind bei jedem Hersteller und Android Version verschieden gemounted.
Die Android - Standardfunktionen versagen meistens bei exotischen Devices.

Wenn du die Funktion in einer App für den Playstore implemtieren magst,
so musst du vorher ordentlich die Mountingpoints ermitteln.

Bsp :

 private ArrayList<String> getMountPoints() {
        ArrayList<String> mountPointList = new ArrayList<String>();
        File voldFstab = new File("/system/etc/vold.fstab");
        Scanner scanner = null;
        try {
            scanner = new Scanner(new FileInputStream(voldFstab));
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                if (line.startsWith("dev_mount") || line.startsWith("fuse_mount")) {
                    String[] lineSplits = line.split("\\s+");
                    String mountPoint = lineSplits[2];
                    if (mountPoint.contains(":")) {
                        mountPoint = mountPoint.substring(0, mountPoint.indexOf(":"));
                    }
                    mountPointList.add(mountPoint);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (scanner != null) scanner.close();
        }
        return mountPointList;
    }

Von dort aus kannst du dann Weitermachen

— geändert am 09.05.2018, 00:09:36

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2018, 05:25:17 via Website

Danke erst mal für eure antworten.
Es ist ein Android 5 ,6,7 Gerät. Ja ich wollte eine Umsetzung im Quellcode Java .Die sd Karte wird unter /storage/Zeichenfolge gemountet. Wie gesagt kann ich lesend darauf zugreifen nur eben nicht schreiben.
Swa00 werde deine Variante testen bin noch nicht dazu gekommen.
Premission habe ich eigentlich gesetzt. Auch die neuen zur Laufzeit.
Vermute das der paht den ich benutze nur lesend gemounted ist.
Bin gespannt welchen path ich mit dem Code bekomme.

Habe mal mit dem ES Dateiexploer oder auch anderen in dem Path "/system/etc" nach der fstab Datei gesucht leider ist bei mir die Datei nicht vorhanden.
Weder vold.fstab noch igentetwas mit fstab , auch nicht unter "/" , "/etc" , "/system/etc" .
Das hatte ich schon mal vor längerer Zeit auch mal gesucht. Wo speichert Android diese datei sonst noch?
Oder kann man mit einem Dateiexploer nicht auf die Datei zugreifen
Erstmal Danke melde ich wenn ich es getestet habe.

— geändert am 09.05.2018, 11:10:22

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2018, 20:41:27 via Website

Hallo habe getestet leider ohne Erfolg.
Denn auf all meinen Android Geräten gibt es keine „fstab“ Datei. Auch im Emulator ist diese kasachische Linux Datei nicht mehr vorhanden. Bei älteren Android Versionen 4.0 -4.2 war die noch vorhanden.
Ich hoffe es weiss jemand welche Datei nun an die Stelle von fstab getreten ist, bzw. wo nun die Mountingpoints gespeichert werden?
Eigentlich weiss ich ja den Path nur kann ich nicht schreibend darauf zugreifen. Entweder fehlt mir eine Permission oder das Dateisystem ist für User nicht Schreibend gemountet.

Habe ich im Manifest gesetzt brauche ich da noch eine?

Was mich auch verwundert ist das ich die Permissen abfrage zur Laufzeit nicht bekomme obwohl ich sie den Code eingefügt habe. Bei der internen Karte kommt die Frage beim ersten Zugriff erfolgt.

Wie kann ich die Karte in Java Mounten ?

Schade das es nicht geht.
Hoffe es Kann mir jemand helfen.

— geändert am 09.05.2018, 21:40:44

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.05.2018, 21:42:05 via Website

Hallo Jockel.

du musst das nicht "mounten", das ist ja schon erledigt, sonst könnte ein Dateiexplorer nicht darauf zufreifen.

Aber wie drückt sich das "funktioniert nicht" aus? Exception eim Schreiben oder kein Fehler, datei wird einfach nicht erstellt?

Hast du daran gedacht, dass du ab Android 5 nicht nur die Manifest Permission Eintragen musst, sondern auch einen PermissionRequest machen, per Code bevor du die Permission wirklich hast und schreiben darfst?
Zudem, ohne konkreten Code ist das Helfen auch immer schwer ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2018, 22:29:20 via Website

Es wird eine exeption File not found ausgelöst. Auch ganz klar den die Datei ist nicht auf dem Handy.

Die Permission ab Android 6 API 23 habe ich natürlich auch zur Laufzeit gesetzt habe ich auch geschrieben.

Das mit den neu mounten war nur ein Gedanke dachte mir schon das dies nicht sinnvoll ist.

— geändert am 09.05.2018, 22:31:08

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.05.2018, 22:38:56 via Website

Wie gesagt ohne Code ist da nix zu machen, ich kann da nur raten was das Problem sein könnte.
Bitte mal lesen und schreiben auf/von der SD posten

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2018, 23:27:23 via Website

public class MainActivity extends AppCompatActivity {
String sSDpath = null;
File   fileCur = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Ask.on(this)
            .debug(true)
            .id(123)
            .forPermissions( Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withRationales("Location permission need for map to work properly",
                    "In order to save file you will need to grant storage permission")
            .go();



    fileCur = new File("/storage/EE05-8261");
    File[] fileArray = fileCur.listFiles();
    // in der List ist das Inhaltsverzeichnis

    File fs = new File(fileCur, "test2");
    fs.mkdir();
    // neuen Ordner erstellen geht nicht

    File fs2 = new File(fileCur, "test3/test.txt");
    fs2.mkdir();
    try
    {
        fs2.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }





    if(  fileCur.canWrite())
    {
        sSDpath = fileCur.getAbsolutePath();
        // wird nicht ausgefürt
    }
    if(  fileCur.canRead())
    {
        sSDpath = fileCur.getAbsolutePath();
        // wird ausgefürt
    }

}

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2018, 23:28:33 via Website

Wenn ich den Path der intern Karte benutze geht alles

Zum Thema Mount Points die befinden sich in der Datei
/PROC/mounts /PROC/SELF/mountinfo

— geändert am 09.05.2018, 23:46:13

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.05.2018, 12:30:45 via Website

So wie ich heraus gefunden habe ist das schreiben seit Android KitKat nicht mehr so auf die SdKarte möglich ist, lesen ja. Schreiben in das eigene Android Verzeichnis ist möglich.
Schreiben auf die Sdkarte ist für das System und System Apps vorbehalten.

Eine Möglichkeit wäre über Storage Access Framework habe ich noch nicht getestet.

@saw00 Danke für den Tipp, aber leider ist die Variante veraltet und so nicht mehr zu gebrauchen.
Und wenn würde ein schreiben auch nicht möglich sein.

Schade das mir hier nicht wirklich einer helfen konnte.
Danke für die Versuche
lg J.

— geändert am 10.05.2018, 12:37:22

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

10.05.2018, 13:01:21 via Website

@saw00 Danke für den Tipp, aber leider ist die Variante veraltet und so nicht mehr zu gebrauchen.
Und wenn würde ein schreiben auch nicht möglich sein.

Ich habe mir erlaubt, Dir einen lauffähigen Code aus meiner eigenen Klasse zu kopieren.
Dieser läuft aktuell von KitKat bis Oreo ohne Probleme. Das Schreiben hat auch nichts damit zu tun , sondern bezieht sich auf deine eigentliche Frage , die SD-Karte im Mountingpoint zu ermitteln.
Schau mal nach deinen SDK Einstellungen im Gradle.

So wie ich heraus gefunden habe ist das schreiben seit Android KitKat nicht mehr so auf die SdKarte möglich ist, lesen ja.

Das stimmt nicht ganz . Ich schreibe direkt auf die SD - und bekanntlich andere Apps auch.
Hast du denn auch die richtigen Permissions zur Runtime angefordert ?

Schade das mir hier nicht wirklich einer helfen konnte.

Das versuchen wir m.E. die ganze Zeit , aber wie schon Pascal geschrieben hat ,
bekommen wir nur Stück für Stück Infos , die uns für eine ordentliche Beantwortung
vorliegen müssen.

Wir wünschen Dir viel Glück bei der Umsetzung.

— geändert am 10.05.2018, 13:15:18

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.05.2018, 13:29:23 via Website

@Saw00 erstmal Danke für die Antwort.
Gradle File hier.

apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "d.j.myapplication"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
compile 'com.vistrav:ask:2.5'
}

Frage wieso kann ich denn die fstab oder vold.fstab Datei auf dem Handy nicht finden ?
auch nicht mit einem Explorer auf dem Handy.
weder auf Asus Tab mit Android 5.0, S5 Mini mit 6.0, oder S6 mit 7.0 ist die Datei vorhanden.

Permission habe ich im manifest
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
zu Laufzeit mit der Lib von Ask https://github.com/00ec454/Ask

Der Quellcod ist auch weiter Oben

Wie gesagt ein Zugriff auf die internne Karte kein Problem, aber die extenne nicht.
Auser der Zugriff auf /storage/EE05-8261/Android/data/packagename/....
/storage/EE05-8261 ist der Path zur im Karten Slot gesteckten Karte. Nicht die Emulierte.

— geändert am 10.05.2018, 14:21:41

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.05.2018, 15:38:31 via Website

So habe es mit dem Emulator getestet. Bis API 17 gibt es die Datei "/system/etc/vold.fstab"
ab API 18 nicht mehr. Somit kann der Code von @saw00 eigentlich nicht funktioniern denn die Datei wird nicht gefunden. Finde das schon sehr sonderbar.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.05.2018, 16:13:20 via Website

Das kann wohl von Rom zu Rom unterschiedlich sein:

https://android.stackexchange.com/a/38448

Hast du dir schonmal angeschaut ob hier was passendes im Array zu finden ist?

File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.05.2018, 17:13:36 via Website

File[] externalStorageFiles=ContextCompat.getExternalFilesDirs(this,null);

Gib mir den Path zur internen emulierten Karte, und /stoarage/EE05-8261/Android/data/Paketname/files

Ist leider nicht das was ich wollte hatte ich auch schon getestet und dieser Path geht auch.

Das bringt mich nicht weiter denn ich will auf die gesamte Karte zugreifen.
Das abfragen des Path ist eigentlich nicht das Problem. Sondern das man auf die Karte keine Schreibrechte ohne Root rechte hat. Zu mindestens weiss ich nicht wie ich das mach.
Das es geht sehe ich an dem Es-Dateiexplorer der kann es auch ohne Root auf dem Handy.

Etwas Hilfreich ist die Abfrage schon denn ohne "/Android...." ist es der Path zum Wurzel Verzeichnis der Karte.

— geändert am 10.05.2018, 17:32:37

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.05.2018, 17:31:44 via Website

Schreiben auf die externe SD ist immer so eine Sache, ich hatte schon Android Versionen, da konnte das auch der ES Dateiexplorer etc. nicht. D.h. da hat sich im laufe der Zeit viel geändert und das macht die Recherche kompiziert, da man immer wiedersprüchliches findet.

https://stackoverflow.com/a/37692121

Aber da es auch "Fix-Apps" gibt, scheint das Schreiben immernoch restriktionen zu haben.

Was sagt den die offizielle Docu dazu?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.05.2018, 17:45:33 via Website

Pascal erstmal Danke für deine Hilfe.

Ja mit Fix-Apps oder auch die /System/etc/platform.xml bearbeiten würde schon gehen hatte auch geklapt.
Mit root rechten auf dem Handy war das auch kein Thema . Wie gesagt es solte auch ohne gehen.
Und wenn es der ES Dateiexplorer kann muss es doch gehen.

Wenn ich es in der Doku richtig gelesen habe hat man nur lese Rechte auf die Karte mit der Ausnahme des Privaten Paket Verzeichnis. Was mir dein Code zurück gibt.

Komisch ist nur das es Apps gibt die es können.

Werde mich wohl damit abfinden müssen.

— geändert am 10.05.2018, 17:46:18

Hilfreich?
Kommentieren