Erlaubnis zum Schreiben auf die SD-Karte

80

Ich möchte, dass meine App die Anwendungsdatenbank auf der SD-Karte archiviert. In meinem Code überprüfe ich, ob das Verzeichnis canWrite()existiert, und wenn nicht, wirf ein IOException. In diesem speziellen Fall versuche ich, die Datenbankdatei in das Stammverzeichnis auf der SD-Karte zu kopieren, aber es wird eine ausgelöst IOException. Wie kann ich die Berechtigung für einen Ordner / eine Datei ändern, um darauf schreiben zu können?

fehlerhaft
quelle

Antworten:

209

Sie haben Recht, dass sich das SD-Kartenverzeichnis befindet, /sdcardaber Sie sollten es nicht hart codieren. Rufen Sie stattdessen an Environment.getExternalStorageDirectory(), um das Verzeichnis abzurufen:

File sdDir = Environment.getExternalStorageDirectory();

Wenn Sie dies noch nicht getan haben, müssen Sie Ihrer App die richtige Berechtigung zum Schreiben auf die SD-Karte erteilen, indem Sie die folgende Zeile zu Ihrem Manifest hinzufügen:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Dave Webb
quelle
Danke ... Ich werde meinen Code gemäß Ihrem Vorschlag ändern. Derzeit habe ich es jedoch fest codiert und habe nicht die Berechtigung in der Manifestdatei festgelegt, aber es ermöglicht mir, es trotzdem auf der SD-Karte zu speichern. Warum kann ich es speichern, ohne die Berechtigung festgelegt zu haben?
Bugzy
4
@ user244190 - Ich vermute, auf Ihrem Telefon läuft Android 1.5. WRITE_EXTERNAL_STORAGEwurde in 1.6 eingeführt, daher müssen Sie es in Ihre Anwendung aufnehmen, wenn Sie möchten, dass es vorwärtskompatibel ist.
Dave Webb
@ DaveWebb: Bitte sehen Sie meine Frage hier: stackoverflow.com/questions/9351904/…
Saher Ahwal
Niemand hat geantwortet und ich weiß nicht, warum das nicht funktioniert.
Saher Ahwal
@ DaveWebb - richtige Idee, aber es ist wahrscheinlich nicht so, dass auf dem Telefon 1.5 ausgeführt wird, sondern dass die App angibt, dass es gegen 1.5 erstellt wurde oder (häufiger) überhaupt keine Version angibt, und wenn ein neueres Telefon sieht, dass es hinzugefügt wird die Erlaubnis zur Abwärtskompatibilität.
Chris Stratton
1

Die oben in Daves Antwort vorgeschlagene Technik ist sicherlich eine gute Entwurfspraxis, und ja, letztendlich muss die erforderliche Berechtigung in der Datei AndroidManifest.xml festgelegt werden, um auf den externen Speicher zugreifen zu können.

Die mono-artige Möglichkeit, die meisten (wenn nicht alle, nicht sicheren) "Manifestoptionen" hinzuzufügen, besteht jedoch in den Attributen der Klasse, die die Aktivität (oder den Dienst) implementiert.

Das Visual Studio Mono-Plugin generiert das Manifest automatisch. Es ist daher am besten, es nicht manuell zu manipulieren (ich bin sicher, dass es Fälle gibt, in denen es keine andere Option gibt).

Zum Beispiel:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")]
public class MonoActivity : Activity
{
  protected override void OnCreate(Bundle bindle)
  {
    base.OnCreate(bindle);
  }
}
Sam ist
quelle
Eigentlich sehe ich jetzt, dass diese Einstellung WRITE_EXTERNAL_STORAGE eine Benutzerberechtigung ist und, wenn sie so eingestellt ist, wie oben angegeben, als Aktivitätseinstellung (android: Berechtigung) und nicht als Benutzerberechtigung in der Manifestdatei angezeigt wird. Oh, ich habe mich gerade daran erinnert, dass Sie dem Benutzer mit Benutzerberechtigungen die Projekteigenschaften in VS festgelegt haben (es ist eine Kontrollkästchenliste aller Berechtigungen).
Samis
1
Es handelt sich tatsächlich um "Verwendungsberechtigungs" -Tags, nicht um "Benutzerberechtigungen", aber ansonsten gilt alles andere.
Samis
Eine Sache, die unbedingt erforderlich ist, ist der Aufruf von if (Build.VERSION.SDK_INT> = 19) {MainActivity.get (). GetExternalFilesDirs (null); } // Um ​​Zugriff auf SD / Android / data / your.package.name zu erhalten // Versuchen Sie nicht, das Paketverzeichnis selbst zu erstellen. Wenn Sie diesen Aufruf nicht ausführen, funktioniert mkdir oder mkdirs nicht.
Pstorli