2016-11-30 3 views
0

Ich versuche, eine JSON-Zeichenfolge in einer Datei im 'externen' Speicher zu speichern. Insbesondere der Ordner Dokumente. Dies sollte der Speicher sein, auf den Sie mit einem Dateibrowser, von Google Mail oder über USB auf Ihrem Computer zugreifen können.Android-App speichert im 'emulierten' Speicher anstelle des aktuellen Verzeichnisses

Also folgte ich die Dokumentation here und kam mit dieser: (. Notiz, geändert nun zuerst ein Verzeichnis erstellen, dann Dateinamen anhängen Speicher jetzt MediaScanner zu verwenden versuchen)

public static File GetDocumentsPath(String tuningName) { 
    // Get the directory for the user's public pictures directory. 
    File dir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()); 
    if (!dir.mkdirs()) { 
     Logy.CallPrint("JSONTuning", "Directory not created"); 
    } 

    File outFile = new File(dir, tuningName); 

    return outFile; 
} 

public static String SaveTuning(Context context, String fileName, String json) 
{ 
    File path; 
    if(fileName.contains(".rfts")) { 
     path = GetDocumentsPath(fileName); 
    } else { 
     path = GetDocumentsPath(fileName+".rfts"); 
    } 


    Logy.Print("|||||||||||||||| "+path.getPath()); 

    try { 
     FileOutputStream fileOut = new FileOutputStream(path); 
     ObjectOutput strOut = new ObjectOutputStream(fileOut); 
     strOut.writeUTF(json); 
     strOut.close(); 
     fileOut.close(); 

     MediaScannerConnection scanner = new MediaScannerConnection(context, null); 
     scanner.connect(); 
     if(scanner.isConnected()) 
      scanner.scanFile(path.getPath(), null); 
     scanner.disconnect(); 

     return "Save Successful"; 
    } 
    catch(java.io.IOException e) { 
     return e.getMessage(); 
    } 
} 

So angemeldet ich den Weg, den ich kam von GetDocumentsPath. Dieser Pfad wäre: /storage/emulate/0/Download/Test.rfts

Dies führt nicht dazu, dass die Datei in Dokumenten gespeichert wird, soweit ich über Dateimanager/Computer darauf zugreifen kann. Die Tatsache, dass das Wort "emuliert" dort drin ist, lässt mich glauben, dass die Umwelt mir den tatsächlichen Weg überhaupt nicht gibt.

ich tun, um die Fehler „/storage/emulated/0/Documents/Test.rfts: öffnen, ist fehlgeschlagen: ENOENT (Keine solche Datei oder das Verzeichnis)“ erhalten

Was den richtigen Pfad zu bringen braucht, und speichern zu , der Dokumentenordner im externen Speicher?

Als eine Nebenbemerkung funktioniert die Art, wie ich die Datei schreibe perfekt für den internen Speicher, da ich keine Probleme beim Erstellen einer Datei mit App-Einstellungen habe.

+0

Auch ich sollte beachten, dass meine App Manifest hat "" –

Antwort

2

Die Tatsache, dass das Wort "emuliert" darin ist, führt mich zu der Annahme, dass die Umwelt mir den tatsächlichen Weg überhaupt nicht gibt.

Ja, ist es.

ich tun, um die Fehler "/storage/emulated/0/Documents/Test.rfts: öffnen, ist fehlgeschlagen: ENOENT (Keine solche Datei oder das Verzeichnis)" erhalten

Möglichkeiten umfassen:

  • Das Verzeichnis existiert nicht. Dies ist typisch für den Emulator. Normalerweise rufen Sie mkdirs() an, um das Verzeichnis zu erstellen, nur um sicher zu sein.

  • Sie laufen auf Android 6.0+ Gerät, Ihre targetSdkVersion ist 23 oder höher, und Sie haben nicht implement runtime permissions.

Beachten Sie auch, dass Sie add more code to have your file show up in other apps or via a file manager on a desktop/notebook computer benötigen.

+0

Hmmm, also ich Marshmallow auf meinem Tablet laufen lassen. Wenn ich die Erlaubnis erhalte, auf externen Speicher zu schreiben, erscheint jedoch kein Popup und die Anfrage wird automatisch abgelehnt. An anderer Stelle in meiner App erbitte ich eine genaue Standortgenehmigung ohne Problem, also bin ich mir nicht sicher, was gibt. –

+0

@MagicMarbles: "Wenn ich die Berechtigung zum Schreiben auf externen Speicher ersuche, wird kein Popup angezeigt und die Anfrage wird automatisch abgelehnt" - gehe zu Einstellungen> Apps> (deine App)> Berechtigungen und gewähre es manuell. Bestätigen Sie, dass Ihre App funktioniert. Sollte dies der Fall sein, gehen Sie zurück in die Einstellungen für Ihre App, deinstallieren Sie von dort, probieren Sie eine Neuinstallation aus und prüfen Sie, ob Sie die Berechtigung anfordern können. – CommonsWare

+0

Scheint so, dass es funktioniert hat.Aber auch mit Erlaubnis bekomme ich immer noch einen emulierten Pfad. Ich kann dazu schreiben und den Erfolg zurückbekommen, aber nichts taucht im Verzeichnis auf. Abgesehen davon hat das Nvidia Shield-Tablet, das ich benutze, nicht einmal einen Ordner "Dokumente", also bin ich jetzt zum Download gegangen. Ich aktualisiere meine Frage mit meiner neuen Speicherfunktion, in der MediaScanner nach der Datei sucht. Ich bin mir aber nicht sicher, ob das stimmt, da nichts mehr auftaucht. –

Verwandte Themen