Permiso para escribir en la tarjeta SD

80

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

bugzy
fuente

Respuestas:

209

Tienes razón en que el directorio de la tarjeta SD es, /sdcardpero no deberías codificarlo. En su lugar, llame a Environment.getExternalStorageDirectory()para obtener el directorio:

File sdDir = Environment.getExternalStorageDirectory();

Si aún no lo ha hecho, deberá otorgar a su aplicación el permiso correcto para escribir en la tarjeta SD agregando la línea a continuación a su manifiesto:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Dave Webb
fuente
Gracias ... Cambiaré mi código según 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 los permisos establecidos?
bugzy
4
@ user244190: supongo que tu teléfono tiene Android 1.5. WRITE_EXTERNAL_STORAGEse introdujo en 1.6, por lo que deberá incluirlo en su aplicación si desea que sea compatible con versiones posteriores.
Dave Webb
@DaveWebb: vea mi pregunta aquí: stackoverflow.com/questions/9351904/…
Saher Ahwal
Nadie ha respondido y no sé por qué eso no funciona.
Saher Ahwal
@DaveWebb: idea correcta, pero probablemente no sea que el teléfono esté ejecutando 1.5, sino que la aplicación especifica que se creó contra 1.5 o (más comúnmente) no especifica una versión en absoluto, y cuando un teléfono más reciente ve que agrega el permiso de compatibilidad con versiones anteriores.
Chris Stratton
1

La técnica sugerida anteriormente en la respuesta de Dave es ciertamente una buena práctica de diseño, y sí, en última instancia, el permiso requerido debe establecerse en el archivo AndroidManifest.xml para acceder al almacenamiento externo.

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

El complemento 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);
  }
}
Sam es
fuente
En realidad, ahora veo que esta configuración de WRITE_EXTERNAL_STORAGE es un permiso de usuario, y si se establece de la forma anterior, aparecerá como una configuración de actividad (android: permiso) y no un permiso de usuario en el archivo de manifiesto. Oh, acabo de recordar que configuraste el usuario de permisos de usuario las propiedades del proyecto en VS (es una lista de casillas de verificación de todos los permisos).
samis
1
En realidad, son etiquetas de "permiso de uso", no "permiso de usuario", pero aparte de eso, todo lo demás es cierto.
samis
Una cosa que es absolutamente necesaria es llamar a 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. No hacer esta llamada da como resultado que mkdir o mkdirs no funcionen.
pstorli