1

我需要用 windows phone 创建一个 qrreader。

Xzing 示例仅将捕获的 qr 字符串打印到视频中,我需要一个示例来了解该字符串是否为 vcard 并因此将其保存在联系人中,或者是否为链接并在浏览器中打开它。

private void ScanPreviewBuffer()
    {

            try
            {
                _photoCamera.GetPreviewBufferY(_luminance.PreviewBufferY);
                var binarizer = new HybridBinarizer(_luminance);
                var binBitmap = new BinaryBitmap(binarizer);
                var result = _reader.decode(binBitmap);
                Dispatcher.BeginInvoke(() => CheckQr(result.Text));
            }
            catch {  }
     }

    private void CheckQr(string qrString)
    {

        VibrateController vibrate = VibrateController.Default;
        vibrate.Start(TimeSpan.FromMilliseconds(500));

        MessageBox.Show(qrString);
        /* CONTROLS HERE */
    }
4

2 回答 2

0

ZXing 有一个ResultParser用静态方法调用的类parseResult。ResultParser 支持一些常见的内容格式,如 vCard、vEvent、URL 等。因此,它为您提供了AddressBookParsedResultvCard 内容返回的实例。

ParsedResult parsedResult = ResultParser.parseResult(result);
于 2013-11-11T16:49:06.733 回答
0

显然你必须首先解析qrString内容以获得你想要的,我想我们都会同意这一点;)

所以主要问题是:

  • 确定格式(url 或 vcard)
  • 解析它们(如果需要)
  • 使用它们触发想要的动作

1.关于电子名片

要确定您是否qrString持有 vCard,也许您可​​以尝试匹配(使用string.Containsstring.StartsWith方法)vCard 标头,该标头BEGIN:VCARD从一个版本到另一个版本似乎始终相同(请参阅wikipedia)。

对于 Windows Phone 7,没有内置功能来解析 vCard,因此您必须自己完成,或者您可以尝试使用vCard 库 For Windows Phone。它将以这种方式使用:

   byte[] byteArray = Encoding.UTF8.GetBytes(qrString);
   using (StreamReader reader = new StreamReader(new MemoryStream(byteArray)))
   {
      vCard card = new vCard(reader);
      // access here card.PropertyFromvCard to get the information you need
   }

关于它的文档并不多,但在 codeplex 上提供了源代码,因此您可能会找到所需的所有属性名称和示例。

对于 Windows Phone 8,内置的ContactInformation.ParseVcardAsync方法可以帮助您解析您的qrString内容(这里是官方教程

然后你需要最终创建你的联系人:

如果您在 Windows Phone 7 上开发应用程序,则无法直接从您的应用程序创建联系人。您需要使用“保存联系人任务”并预填充您需要的字段。这是一个例子:

SaveContactTask saveContactTask = new SaveContactTask();
saveContactTask.Completed += new EventHandler<SaveContactResult>(saveContactTask_Completed);
saveContactTask.FirstName = "John"; // card.PropertyFromvCard and so on...
saveContactTask.LastName = "Doe";
saveContactTask.MobilePhone = "2065550123";
saveContactTask.Show();

如果您在 Windows Phone 8 上进行开发(鉴于您的问题标签,情况似乎并非如此),您可以创建自定义联系人存储并直接写入其中

2.关于网址

要知道您是否正在处理 URL,我建议您遵循此SO 答案附带的建议。长话短说,这是您可以使用的代码或至少类似的代码:

static bool IsValidUrl(string qrString)
{
    Uri uri;
    return Uri.TryCreate(urlString, UriKind.Absolute, out uri)
        && (uri.Scheme == Uri.UriSchemeHttp
         || uri.Scheme == Uri.UriSchemeHttps
         || uri.Scheme == Uri.UriSchemeFtp
         || uri.Scheme == Uri.UriSchemeMailto
            /*...*/);
}

最后,要在 Web 浏览器中打开您的 URL(当然,如果它是有效的),您可以使用WebBrowser 任务或使用WebBrowser 控件将真正的 WebBrowser 嵌入到您的应用程序中并充分利用它。

于 2013-11-05T23:31:34.567 回答