android - ¿Cómo abro un archivo recién escrito desde el directorio de almacenamiento de la aplicación en as3/flex mobile?
actionscript-3 air (4)
Estoy trabajando en una aplicación (flex 4.12 sdk, usando flashbuilder 4.5, creando una aplicación para iOS y Android, probando principalmente en un HTC htc) ... y estoy usando la cámara para capturar un archivo ... Entonces guardo esa imagen al directorio de almacenamiento de la aplicación, y quiero abrir la imagen en el navegador web predeterminado o activar un diálogo nativo (usuarios de Android) para elegir el navegador web de su elección ... cómo se abre realmente no es importante en este momento - Im sobre todo tratando de simplemente ''acceder'' con el dispositivo y ''cargarlo'' fuera de mi aplicación de aire ...
aquí está el código que tengo:
var fs2 : FileStream = new FileStream();
fs2.addEventListener(Event.CLOSE, fileCompleteHandler);
var targetFile : File = File.applicationStorageDirectory.resolvePath("test.jpg");
fs2.openAsync(targetFile, FileMode.WRITE);
fs2.writeBytes(myBMDByteArray,0,myBMDByteArray.length);
fs2.close();
y para el oyente de eventos que detecta el cierre del archivo recién creado:
function fileCompleteHandler(e:Event):void {
trace(''File saved.'');
trace(''exists? '' + targetFile.exists);
trace(''the url: '' + targetFile.url);
trace(''path: '' + targetFile.nativePath);
navigateToURL(new URLRequest(targetFile.url));
}
Obtengo la siguiente información de este oyente
- Archivo guardado.
- existe? cierto
- la url: app-storage: /test.jpg
- ruta: /data/data/air.com.xxxxx.apptesting.debug/com.xxxxx.apptesting.debug/Local Store / test.jpg
... y el problema es que navigateToURL no puede acceder a la ubicación donde está almacenado el archivo (el protocolo se muestra en el navegador como archivo: /// data / data / air.com / xxx ...)
¿Cómo puedo usar navigateToURL para obtener acceso a este archivo recién creado en el navegador web o en cualquier aplicación nativa que el dispositivo asocie con el archivo (es un archivo .JPG)? También tuve éxito agregando la imagen recién creada al rollo de la cámara, pero no pude encontrar la manera de abrir la imagen recién guardada en el rollo de la cámara original o la aplicación que el dispositivo elija o presente al usuario para el formato .jpg.
Puedo mostrarle al usuario la imagen DENTRO de mi aplicación haciendo referencia a los datos de mapa de bits, solo quiero dar acceso al usuario al archivo físico que estoy creando en su dispositivo.
Incluso tuve éxito en publicar (a través de urlLoader) los datos de mapa de bits como codificación base64 y luego crear un archivo en el servidor y cargar esa url, pero la codificación y el viaje hacia y desde el servidor para darle al usuario la imagen agrega una gran cantidad de sobrecarga y lleva un poco demasiado tiempo y me gustaría evitar ese proceso alargado.
Gracias por cualquier ayuda que alguien pueda brindarme, avíseme si necesito ser más específico en todo esto.
Mi primera corazonada es que debe especificar los permisos de usuario adecuados en el descriptor de su aplicación para que pueda usar la funcionalidad openWith con el contenido de su aplicación.
Recuerde que debe especificar esto específicamente para iOS y Android.
Resolvió el problema ... Pude almacenar / escribir mi archivo en el directorio de documentos usando:
var targetFile : File = File.documentsDirectory.resolvePath(''test.jpg'');
y entonces
navigateToURL(new URLRequest(targetFile.url));
Y esto funciona bien ahora. ¡Espero que ayude a alguien más! Parece que el directorio de almacenamiento DEBERÍA funcionar pero hasta ahora solo he escrito y leído archivos almacenados allí ... tal vez para abrir los archivos que uno TIENE para copiarlos a una ubicación ''segura'' en el sistema de archivos (es decir, tarjeta SD). ... pasará a probar en ios Ahora, espero que todo funcione bien en ese sistema operativo. Gracias a todos los que intervinieron en esto.
En su application.xml necesita estos permisos establecidos dentro de android> manifestAdditions> manifest:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Con estos permisos, puede guardar archivos en applicationStorageDirectory:
const FILE_LOADER:URLLoader = new URLLoader();
FILE_LOADER.addEventListener(Event.COMPLETE, onTempFileComplete);
FILE_LOADER.dataFormat = URLLoaderDataFormat.BINARY;
FILE_LOADER.load(new URLRequest(BASE_URL + filePath));
La applicationStorageDirectory
a la que pertenece también solo puede acceder a applicationStorageDirectory cuando usa Android o iOS. navigateToURL()
entrega su solicitud al navegador predeterminado, que no puede acceder a dicho directorio.
documentsDirectory
es un directorio público en Android, pero no en iOS. Por lo tanto, no se puede usar para ambas plataformas. Lamentablemente, ninguna de las rutas de archivos precompiladas tiene un directorio público en iOS. Puede encontrar una tabla que explica todos los caminos precompilados aquí