2010-01-23 9 views
73

Je voudrais que mon application archive le DB d'application sur la carte SD. Dans mon code je vérifie si le répertoire canWrite() existe, et sinon, lancez un IOException. Dans ce cas particulier, j'essaie de copier le fichier db dans le répertoire racine sur la carte SD, mais il lance un IOException. Comment puis-je modifier la permission sur un dossier/fichier pour pouvoir y écrire?Autorisation d'écriture sur la carte SD

Répondre

201

Vous avez raison: le répertoire de la carte SD est /sdcard mais vous ne devriez pas le coder en dur. Au lieu de cela, faire un appel à Environment.getExternalStorageDirectory() pour obtenir le répertoire:

File sdDir = Environment.getExternalStorageDirectory(); 

Si vous ne l'avez pas déjà fait, vous aurez besoin de donner à votre application la permission correcte d'écrire sur la carte SD en ajoutant la ligne ci-dessous pour votre Manifest:

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

Merci ... Je vais changer mon code selon votre suggestion. Cependant actuellement je l'ai codé en dur, et n'ai pas l'autorisation définie dans le fichier manifeste, mais il me permet de l'enregistrer sur la carte SD de toute façon. Pourquoi suis-je capable de le sauvegarder sans avoir la permission? – bugzy

+4

@ user244190 - Je suppose que votre téléphone fonctionne sous Android 1.5. 'WRITE_EXTERNAL_STORAGE' a été introduit en 1.6, vous devrez donc l'inclure dans votre application si vous voulez qu'elle soit compatible avec le forward. –

+0

gotcha. merci ... – bugzy

1

la technique proposée ci-dessus dans la réponse de Dave est certainement une bonne pratique de conception, et oui, finalement, l'autorisation nécessaire doit être défini dans le fichier AndroidManifest.xml pour accéder au stockage externe. Cependant, la façon la plus simple d'ajouter la plupart (sinon toutes) des «options manifestes» réside dans les attributs de la classe implémentant l'activité (ou le service). Le plugin Visual Studio Mono génère automatiquement le manifeste, il est donc préférable de ne pas le modifier manuellement (je suis sûr qu'il existe des cas où il n'y a pas d'autre option).

Par exemple:

[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); 
    } 
} 
+0

Actuellement, je vois maintenant que ce paramètre WRITE_EXTERNAL_STORAGE est une autorisation d'utilisateur, et s'il est défini comme ci-dessus, apparaîtra comme un paramètre d'activité (android: permission) et non comme une permission d'utilisateur dans le fichier manifeste. Oh, je viens de me rappeler, vous définissez l'utilisateur des autorisations utilisateur les propriétés du projet dans VS (c'est une liste de toutes les autorisations). – samosaris

+1

Ce sont en fait des balises "uses-permission", pas "user-permission", mais à part cela, tout le reste est vrai. – samosaris

+0

Une chose qui est absolument nécessaire est d'appeler if (Build.VERSION.SDK_INT> = 19) { MainActivity.get(). GetExternalFilesDirs (null); } // Pour accéder à SD/Android/data/your.package.name // N'essayez pas de créer vous-même le répertoire du package. Si cet appel n'est pas effectué, mkdir ou mkdirs ne fonctionneront pas. – user2607942

Questions connexes