2010-01-23 24 views
73

Me gustaría que mi aplicación archive la base de datos de la aplicación en la tarjeta SD. En mi código, verifico si existe el directorio canWrite(), y si no, arroje un IOException. En esta instancia particular, estoy tratando de copiar el archivo db al directorio raíz en la tarjeta SD, pero está arrojando un IOException. ¿Cómo puedo cambiar el permiso en una carpeta/archivo para poder escribir en él?Permiso para escribir en la tarjeta SD

Respuesta

201

Tiene razón en que el directorio de la tarjeta SD es /sdcard pero no debería ser difícil de codificar. En su lugar, hacer una llamada a Environment.getExternalStorageDirectory() para obtener el directorio:

File sdDir = Environment.getExternalStorageDirectory(); 

Si no lo ha hecho, se le tenga que dar su aplicación el permiso correcto escribir en la tarjeta SD mediante la adición a la línea de abajo su Manifiesto:

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

Gracias ... voy a cambiar mi código como por su sugerencia. Sin embargo, actualmente lo tengo codificado y no tengo el permiso establecido en el archivo de manifiesto, pero me permite guardarlo en la tarjeta SD de todos modos. ¿Por qué puedo guardarlo sin tener el conjunto de permisos? – bugzy

+4

@ user244190 - supongo que su teléfono tiene Android 1.5. 'WRITE_EXTERNAL_STORAGE' se introdujo en 1.6, por lo que deberá incluirlo en su aplicación si desea que sea compatible con versiones anteriores. –

+0

gotcha. gracias ... – bugzy

1

la técnica sugerida anteriormente en la respuesta de Dave es sin duda una buena práctica de diseño, y sí en última instancia del permiso necesario se debe establecer en el archivo AndroidManifest.xml para acceder al almacenamiento externo.

Sin embargo, la forma Mono-esque para agregar la mayoría (si no todas, no estoy seguro) de "opciones de manifiesto" es a través de los atributos de la clase que implementa la actividad (o servicio).

El plugin de Visual Studio Mono genera automáticamente el manifiesto, por lo que es mejor no manipularlo manualmente (estoy seguro de que hay casos en los que no hay otra opción) .

Por ejemplo:

[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

En realidad, ahora veo que esta configuración WRITE_EXTERNAL_STORAGE es un permiso del usuario, y si se establece tal como está arriba, aparecerá como una configuración de actividad (android: permission) y no como un permiso del usuario en el archivo de manifiesto. Ah, acabo de recordar, estableces el usuario de permisos de usuario las propiedades del proyecto en VS (es una lista de todos los permisos). – samosaris

+1

Son en realidad "etiquetas de permiso de uso", no "permiso de usuario", pero aparte de eso, todo lo demás es verdadero. – samosaris

+0

Una cosa que es absolutamente necesaria es llamar al if (Build.VERSION.SDK_INT> = 19) { MainActivity.get(). GetExternalFilesDirs (null); } // Para obtener acceso a SD/Android/data/your.package.name // No intente crear el directorio del paquete usted mismo. Al no realizar esta llamada, mkdir o mkdirs no funcionan. – user2607942

Cuestiones relacionadas