none
Como usar PickSingleFileAndContinue y App.cs para abrir ficheros RRS feed

  • Pregunta

  • Buenos días,

    estoy realizando una actualización a una de mis Apps universales y he añadido la funcionalidad de asociar una extensión de fichero y de abrir ficheros con la App. En la versión del pc no he tenido ningún problema, lo tengo todo funcionando pero me he puesto a probarlo en el móvil y no funciona. Me he puesto a revisar el código y a buscar información y me he percatado que en el móvil no se puede utilizar

    StorageFileimgFile = awaitopenPicker.PickSingleFileAsync();

    Por lo que según he leído tengo que usar PickSingleFileAndContinue(). He visto algunos ejemplos y tengo que utilizar la clase ContinuationManager.cs y se como debo hacer las modificaciones pertinentes en el código de las paginas pero no entiendo lo que debo modificar en App.cs Además, mi App tiene lectura de ficheros diferentes en paginas diferentes, y en una de ellas puede ser iniciada por la asociación del fichero.

    Por favor, ¿me podríais explicar como debo hacer en App.cs para que sepa restaurarse correctamente?

    Muchas gracias

    • Cambiado Karen Malagón jueves, 23 de julio de 2015 17:03 Universal Windows Apps issue
    jueves, 23 de julio de 2015 9:38

Respuestas

  • Buenos días Sergio,

    Muchas gracias por tu respuesta, el fallo que había cometido es ridículo... Cuando estas depurando, cuando se inicia el filepicker, la App no se suspende en el móvil, ya que controlas manualmente el estado de la App desde el VS. Cuando me percate de este error, forcé a que la App en ese momento se suspendiese y tengo puesto que cualquier error de la App (desde App.cs) me lo notifique así que ahí ya pude leer cual era el error. Había creado un nuevo objeto el cual no puede serializarlo  y lo había pasado entre Frames y ahí es donde me daba el error. Si lo hacia sin consultas, no intercambiaba nada asi que podía suspenderse correctamente. En cambio, cuando hacia las consultas, si que pasaba el resultado... y ahí mi error.

    Muchas gracias!!

    martes, 28 de julio de 2015 9:22

Todas las respuestas

  • Buenas tardes,

    Muchas gracias Karen por la reubicación de la pregunta, no sabia que había una sección para Apps universales. ¿alguna idea de como puedo solventarlo?

    Muchas gracias

    viernes, 24 de julio de 2015 16:37
  • Buenas tardes,

    Después de mirar ejemplos parece que he conseguido algo. Os cuento a todos que es lo que he hecho. En la clase Page correspondiente, he hecho que pertenezca a IFileOpenPickerContinuable he implementar el método que será llamado cuando continúe la App.

    En App.cs he tenido que crear un objeto private ContinuationManager continuationManager; que es el encargado de facilitarnos la vida para la gestión de suspender y recuperar la App al seleccionar un fichero.

    En el método OnActivated escribiremos el siguiente código:

    if (args.Kind == ActivationKind.PickFileContinuation)

                {

                    base.OnActivated(args);

                    continuationManager = new ContinuationManager();

                    var continuationEventArgs = args as IContinuationActivatedEventArgs;

                    if (continuationEventArgs == null)

                        return;

                    else

                    {

                        Frame frame=CreateRootFrame();

                        RestoreStatus(args.PreviousExecutionState);

                        //var frame = Window.Current.Content as Frame;

                        if (frame != null)

                        {

                            continuationManager.Continue(continuationEventArgs, frame);

                        }

                    }

                }

    Este código solo lo debe ejecutar si es Windows Phone, la versión de PC no debe hacerlo. Lo que hacemos es rescatar el frame si existe, que para este caso nos valdría con la línea comentada en vez de las dos anteriores según las pruebas que he hecho, pero para generalizar y evitar posibles errores, lo he montado así.

    Como ya he comentado, lo he probado y funciona 2 de 3 casos que tenía planteado. En los que son abrir un fichero de texto para leerlo y sin más funciona a la primera, sin errores. En cambio, en el último caso que se trata que abra una imagen tengo dos experiencias curiosas. Si lo ejecuto conectado al ordenador en modo debug, no da ningún error. En cambio, en cuanto detengo el debug y uso la App normal, al dar a abrir una imagen, se muestra momentáneamente el selector de ficheros y se cierra todo. ¿Se os ocurre que le puede pasar?

    Y después de todo, espero que resulte útil el código que he montado.

    Muchas gracias de nuevo

    sábado, 25 de julio de 2015 17:14
  • Buenos días,

    he seguido realizando mas pruebas y en un proyecto vacio funciona todo a la primera, es decir, con debug y sin el. En cambio en la App que he añadido la funcionalidad se cierra en cuanto no hago debug. He realizado mas pruebas y parece que hay algo que no le gusta pero no se que es. Os cuento, he lanzado el filepicker desde la pagina principal y no ha dado error, pero si lo lanzo después de haber hecho unas consultas a la base de datos se cierra.

    ¿Tiene algo especial con los hilos (async, task)?¿necesita algo en el manifiesto? Por favor, ya me comentareis que posibles fallos he cometido.

    Muchas gracias de nuevo

    domingo, 26 de julio de 2015 10:14
  • hola. Tu problema se reproduce en la depuración de tu app? O también en la desplegada. Te recomiendo establecer bloques try catch en la parte de tu código que "falla" y capturar la posible excepción producida. También puedes ir a Menú Depurar/excepciones/marcar Common Language Runtime. Para que depuración la ejecución de tu app se detenga en la línea que produzca alguna excepción

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 28 de julio de 2015 5:44
    Moderador
  • Buenos días Sergio,

    Muchas gracias por tu respuesta, el fallo que había cometido es ridículo... Cuando estas depurando, cuando se inicia el filepicker, la App no se suspende en el móvil, ya que controlas manualmente el estado de la App desde el VS. Cuando me percate de este error, forcé a que la App en ese momento se suspendiese y tengo puesto que cualquier error de la App (desde App.cs) me lo notifique así que ahí ya pude leer cual era el error. Había creado un nuevo objeto el cual no puede serializarlo  y lo había pasado entre Frames y ahí es donde me daba el error. Si lo hacia sin consultas, no intercambiaba nada asi que podía suspenderse correctamente. En cambio, cuando hacia las consultas, si que pasaba el resultado... y ahí mi error.

    Muchas gracias!!

    martes, 28 de julio de 2015 9:22