No se pueden crear archivos en Android con Xamarin

Tengo una aplicación Xamarin-Studio para Android y simplemente quiero descargar archivos y guardarlos localmente. Pero cuando intento crear un archivo en la carpeta de files me sale una excepción:

 File.Create("data/data/com.company.app/files/newFile.png"); 

Me da

 System.UnauthorizedAccessException Access to the path 'data/data/com.company.app/files/newFile.png' is denied. 

¿Qué estoy haciendo mal?

Debe utilizar Environment o IsolatedStorage. Por ejemplo:

 var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); var filename = Path.Combine(path, "newFile.png"); 

Estoy codificando Xamarin con VS2013. Tuve el acceso denegado error para un directorio creado con la aplicación que estoy escribiendo. Mi aplicación crea un directorio llamado /storage/emulated/0/POIApp concatenando vía:

 System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "POIApp"); 

Descubrí que tenía que usar VS2013 para editar las "propiedades" de mi aplicación (POIApp), es decir, hacer clic con el botón derecho del ratón en el icono del proyecto en el explorador de soluciones; Elija las propiedades en el menú emergente. Aparecerá una nueva pestaña en la ventana principal del VS2013. A la izquierda hay algunas opciones, por ejemplo, Aplicación, Manifiesto de Android, Opciones de Android, Construir, etc. Elija "Manifiesto de Android". En la parte inferior del panel principal hay una sección "permisos requeridos". Mi problema se resolvió cuando comprobé "READ_EXTERNAL_STORAGE" y "WRITE_EXTERNAL_STORAGE".

Finalmente me di cuenta de que File.create() no era el problema. Tenía código como este:

 string tmpFilePath = FilesDir.AbsolutePath.stringByAppendingPath (f.Path); Java.IO.File tmpFile = new Java.IO.File( tmpFilePath); tmpFile.Mkdirs (); 

Sin embargo, Mkdirs() no sólo crea todos los directorios intermedios – como yo había asumido – sino que también crea un directorio en la ruta del archivo en sí. Así que el archivo no se pudo crear porque ya había un directorio con el mismo nombre. La forma correcta es:

 string tmpFile = FilesDir.AbsolutePath.stringByAppendingPath (f.Path); Java.IO.File tmpParentFolder = new Java.IO.File(tmpFile).getParentFile(); tmpParentFolder.Mkdirs (); 

En mi defensa, una excepción FileExistsAndIsDirectory habría sido mucho más útil que la excepción UnauthorizedAccessException

Agregue el siguiente permiso al archivo Android.Manifest

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

Usando Mono, creo que debe ser el mismo que en Xamarin Studio.

 var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); File.Create(path + "newFile.png"); 
  • Http sesión siempre se crea en la versión Android ModernHttpClient (okHttp1.5)
  • Es libre de monocrómenos?
  • Diseño personalizado para DialogFragment OnCreateView vs. OnCreateDialog
  • Portar Card.IO a C # Xamarin Studio
  • MVVMCross Obtener SelectedItem de un MvxBindableListView
  • Monodroid - Manejo Haga clic en eventos dentro de las filas ListAdapter
  • La aplicación no se implementa en el emulador de Android Intel en la API 19 (plataforma 4.4.2)
  • Android FragmentTab host y Fragmentos dentro de Fragmentos
  • ObjectAnimator Proxy para animar TopMargin no puede encontrar setting / getter
  • Error al crear el proyecto Xamarin.Android con Google Play Services
  • ¿Cómo detectar la salida de la aplicación en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.