c# - the - instalar windows 10 mobile desde pc
Windows Phone 8.1 MediaCapture congela el teléfono (3)
Creo que tu problema es la caché de la página habilitada. Intente eliminar esta línea en su código this.NavigationCacheMode = NavigationCacheMode.Required;
Quiero hacer una aplicación sencilla que me permita verificar algunos parámetros de cada fotograma de vista previa, pero me quedé atrapado al ejecutar y detener la vista previa.
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
MediaCapture _MediaCapture;
bool _recording;
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached.
/// This parameter is typically used to configure the page.</param>
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
var rearCamera = devices[0];
if (devices.Count > 0)
{
rearCamera = devices.Single(currDev =>
currDev.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
);
}
_MediaCapture = new MediaCapture();
await _MediaCapture.InitializeAsync(new MediaCaptureInitializationSettings() { VideoDeviceId = rearCamera.Id });
// this is CaptureElement
xCapture.Source = _MediaCapture;
_recording = false;
}
protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
if(_MediaCapture != null)
{
await _MediaCapture.StopPreviewAsync();
await _MediaCapture.StopRecordAsync();
_MediaCapture.Dispose();
_MediaCapture = null;
xCapture.Source = null;
}
base.OnNavigatedFrom(e);
}
// button click handler
private async void StartMeasure(object sender, RoutedEventArgs e)
{
if (_recording)
{
//await _MediaCapture.StopPreviewAsync();
_MediaCapture.VideoDeviceController.TorchControl.Enabled = false;
_recording = false;
}
else
{
//await _MediaCapture.StartPreviewAsync();
_MediaCapture.VideoDeviceController.TorchControl.Enabled = true;
_recording = true;
}
}
}
De esta forma, funciona perfectamente.
Si elimino esas líneas de vista previa, funciona, pero solo una vez.
Si presiono el botón tres veces: encendido, apagado y encendido obtengo una excepción en la línea con la activación de TorchControl.
System.Exception: Excepción de HRESULT: 0xE801000D en Windows.Media.Devices.TorchControl.put_Enabled (valor booleano) en Pulsometr3.MainPage.d__d.MoveNext ()
El HRESULT varía.
Lo que es aún más extraño, a veces se congela el teléfono (como 2 de cada 3 veces) y tengo que mantener el poder + bajar el volumen.
Traté de decorar todos los métodos con [STAThread], pero no ayudó ( http://technet.microsoft.com/en-ca/br226599 ).
Lo que es aún más interesante, cuando tengo operaciones por debbuger usando F10 para pasar las líneas, puedo alternar la vista previa tantas veces como quiera. Es werid, ya que el depurador contiene todos los hilos, ¿verdad? Entonces, en teoría, ¿no hay diferencia?
Además, el teléfono a veces se congela en el despliegue ... Y eso es simplemente molesto.
¿Algunas ideas?
Me metí exactamente en esto ... por alguna razón, a Microsoft no le importa mucho su sistema operativo sucesor de WP8, lo que me entristece mucho. Pero también fue hace medio año durante el verano, he intentado esto, tal vez puedes probar Google con los consentimientos de la aplicación y también verificar los manifiestos de tu aplicación, si tienes la cámara frontal / trasera y la cámara web marcadas :) Además que si no funciona, entonces mala suerte, debes seguir con la versión de wp 8.0, que funciona exactamente igual en wp 8.1 así que no te preocupes :) también otras libs como Facebook stuff o parse.com no funcionarán en wp 8.1 C # :)
si entiendo correctamente, el botón tiene un controlador StartMeasure que es un método asíncrono y está a la espera de Start / StopPreviewAsync (). El problema podría ser que si hace clic en el botón más de una vez, la única acción puede estar esperando (en progreso) y la otra también se llama, esto podría causar algunos problemas, ya que intentará iniciar y detener la vista previa al mismo tiempo que probablemente dará lugar a algunas condiciones de carrera. Puede verificar esto agregando un bloqueo para administrar el acceso al administrador de captura para probar esto. Además, verificar el bool y asignarlo después de una operación esperada no es una operación atómica, sino que también podría conducir a condiciones de carrera.
private object locker;
private async void StartMeasure(object sender, RoutedEventArgs e)
{
lock (locker)
{
if (_recording)
{
await _MediaCapture.StopPreviewAsync();
}
else
{
await _MediaCapture.StartPreviewAsync();
}
_recording = !_recording;
_MediaCapture.VideoDeviceController.TorchControl.Enabled = _recording;
}
}