【发布时间】:2019-12-08 23:08:59
【问题描述】:
我的 CaptureElements 表现出奇怪的行为。当我将实例化的 MediaCapture 设置为 CaptureElements Source 然后调用 MediaCapture.StartPreviewAsync() 时,CaptureElement 不显示任何内容。
我在 LoginPage 上有一个带有功能性 BarcodeScanner 的应用程序(主应用程序)。 -> 有效!
然后我想将相同的代码复制到 SettingsPage 并稍作修改,以便在连接多个摄像头的情况下,可以设置默认的一个。 -> 不工作
然后我尝试借助远程调试器在与我的机器具有相同 Windows 10 版本的其他 Windows 平板电脑上运行主应用程序(请记住,登录屏幕上的 BarcodeScanner 可以在我的机器上运行)。 -> 不工作
由于这些故障,我将运行代码从 main-apps LoginPage 复制到了一个全新的解决方案(我们称之为 test-app),其设置与原始解决方案相同。我什至尝试引用相同的 Dll,实现相同的设计模式等。 -> 不工作
我的机器: 赢 10 专业版 版本 1809 构建 17763.652
开发环境: 微软视觉工作室 2019 专业版 版本。 16.1.6
编辑:作为最低要求的 Windows 版本,我选择了 Build 16229 和 我的目标版本是 Build 17763(我的系统 Win 版本)
Widows 设置中的“允许应用访问您的相机”-选项被切换为开启,因此所有应用都可以访问相机。
Xaml
<Page
x:Class="QrCodeTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:QrCodeTest"
xmlns:vm="using:QrCodeTest.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.DataContext>
<vm:TestViewModel x:Name="ViewModel" />
</Page.DataContext>
<ScrollViewer>
<StackPanel>
<Button Content="Start Preview" HorizontalAlignment="Center" Click="Button_Click" Margin="5" />
<CaptureElement x:Name="capturePreview" HorizontalAlignment="Center" Stretch="Uniform" Width="0" Height="0" Margin="10" />
<Button Content="Stop Preview" HorizontalAlignment="Center" Click="Button_Click_1" Margin="5" />
<TextBlock Text="{Binding Etikett, Mode=TwoWay}" HorizontalAlignment="Center" Margin="5" />
</StackPanel>
</ScrollViewer>
</Page>
代码隐藏
private BarcodeScanner scanner { get; set; }
private ClaimedBarcodeScanner claimedScanner { get; set; }
private MediaCapture captureManager { get; set; }
internal async Task StartScannerAsync () {
capturePreview.Visibility = Visibility.Visible;
capturePreview.Width = 400; capturePreview.Height = 300;
scanner = null;
scanner = await DeviceHelpers.GetFirstDeviceAsync(BarcodeScanner.GetDeviceSelector(connectionTypes), async (id) => await BarcodeScanner.FromIdAsync(id));
if (scanner != null) {
captureManager = new MediaCapture();
claimedScanner = await scanner.ClaimScannerAsync();
if (claimedScanner != null) {
claimedScanner.ReleaseDeviceRequested += claimedScanner_ReleaseDeviceRequested;
claimedScanner.DataReceived += claimedScanner_DataReceived;
claimedScanner.IsDecodeDataEnabled = true;
IReadOnlyList<uint> supportedSymbologies = await scanner.GetSupportedSymbologiesAsync();
foreach (uint symbology in supportedSymbologies) {
listOfSymbologies.Add(new SymbologyListEntry(symbology));
}
await claimedScanner.EnableAsync();
MediaCaptureInitializationSettings _captureInitSettings = new MediaCaptureInitializationSettings {
VideoDeviceId = scanner.VideoDeviceId,
StreamingCaptureMode = StreamingCaptureMode.AudioAndVideo,
PhotoCaptureSource = PhotoCaptureSource.VideoPreview
};
await captureManager.InitializeAsync(_captureInitSettings);
capturePreview.Source = captureManager;
try {
// Change to false, in case you wanna compare different methods of doing the same
bool Like_MP_PAT_UWP = false;
if (Like_MP_PAT_UWP) {
await capturePreview.Source.StartPreviewAsync();
await claimedScanner.StartSoftwareTriggerAsync();
} else {
LocalDataContext.Etikett = "await captureManager.StartPreviewAsync();";
await captureManager.StartPreviewAsync();
await claimedScanner.StartSoftwareTriggerAsync();
Thread.Sleep(2000);
await claimedScanner.StopSoftwareTriggerAsync();
await captureManager.StopPreviewAsync();
LocalDataContext.Etikett = "await capturePreview.Source.StartPreviewAsync();";
await capturePreview.Source.StartPreviewAsync();
await claimedScanner.StartSoftwareTriggerAsync();
Thread.Sleep(2000);
await claimedScanner.StopSoftwareTriggerAsync();
await capturePreview.Source.StopPreviewAsync();
LocalDataContext.Etikett = "await claimedScanner.ShowVideoPreviewAsync();";
await claimedScanner.ShowVideoPreviewAsync();
await claimedScanner.StartSoftwareTriggerAsync();
Thread.Sleep(2000);
await claimedScanner.StopSoftwareTriggerAsync();
claimedScanner.HideVideoPreview();
}
} catch (Exception e) {
Exception x = e; displayRequest.RequestRelease();
} finally {
LocalDataContext.Etikett = string.Empty;
}
}
}
}
视图模型:
public class TestViewModel: INotifyPropertyChanged {
public static TestViewModel Instance { get; set; }
private string _Etikett;
public string Etikett { get { return _Etikett; } set { _Etikett = value; NotifyPropertyChanged(); } }
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged ([CallerMemberName] String propertyName = "") {
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
if (PropertyChanged != null) {
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我已经浪费了 4 个工作日来比较解决方案、代码等。上面的代码是从测试应用程序复制的,但它与主应用程序 LoginPage 上的代码基本相同(除了“如果(Like_MP_PAT_UWP) {...}"。
欢迎任何提示。
提前谢谢你。
【问题讨论】:
-
您好,您是否开启了
Package.appxmanifest中的Pointer of Services权限? -
你好,是的。 PointOfService 以及网络摄像头。在测试应用程序中,我授予了 appxmanifest 中的所有可用权限。我什至尝试了几个代码签名证书。没有任何帮助。附加信息:作为最低要求的 Windows 版本,我选择了 Build 16229,我的目标 Build 是 17763(我的系统 Win 版本)
-
你在程序运行的时候加了断点吗?由于您的代码缺少关键功能
GetFisrtDeviceAsync,因此我无法判断问题是否存在。可以尝试单步执行程序,看是否能顺利运行到captureManager.StartPreviewAsync() -
是的,我已经设置了数千个调试点。我在 CodeBehind 中调用 GetFirstDeviceAsync()。请查看第二个代码块。你会看到:scanner = await DeviceHelpers.GetFirstDeviceAsync(
-
我明白了。我在微软提供的example中找到了类似的方法,不知道你是不是这样实现的。
标签: c# uwp barcode-scanner pointofservice