Windows Phone 8蓝牙错误HRESULT:0x8007271D

我一直在尝试开发我的Windows Phone 8应用程序来访问配对的蓝牙设备(打印机)并发送一些打印数据。

我正在开发Windows 8 64位并使用VS2012 Express。 由于仿真器不支持蓝牙,我一直在将该版本上传到诺基亚Lumia 820进行测试。

我使用了以下两个站点作为参考:

http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207007(v=vs.105).aspx

http://www.geekchamp.com/articles/getting-started-with-bluetooth-in-windows-phone-8

应用程序找到配对设备并通过Debug命令输出打印机名称。

代码一直运行到这一点:

await socket.ConnectAsync(selectedDevice.HostName, "1"); 

然后它打破了以下exception:

 ********** EXCEPTION OCCURED ********** Data: System.Collections.ListDictionaryInternal InnerException: Message: An attempt was made to access a socket in a way forbidden by its access permissions. (Exception from HRESULT: 0x8007271D) StackTrace: at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at mobility.PrinterSettings.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__0(Object state) ********** EXCEPTION OCCURED ********** 

如果在socket.ConnectAsync之前删除“await”(selectedDevice.HostName,“1”); 然后代码将继续没有任何错误,但没有蓝牙连接?

我已经尝试了教程中的每个1到30的数字,并且我还确保在WMAppManifest.xml中启用了ID_CAP_NETWORKING。

请问有人有什么想法吗?

完整代码:

 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using Windows.Networking.Proximity; using System.Diagnostics; using Windows.Networking.Sockets; using Microsoft.Phone.Tasks; using System.Text; using Windows.Storage.Streams; namespace mobility { public partial class PrinterSettings : PhoneApplicationPage { public PrinterSettings() { InitializeComponent(); PrinterName.Text = App.loadString("PrinterName"); if (PrinterName.Text == null || PrinterName.Text == "") { PrinterName.Text = "QL420"; } } private void Save_Click(object sender, RoutedEventArgs e) { if (PrinterName.Text != null && PrinterName.Text != "") { App.saveString(PrinterName.Text, "PrinterName"); MessageBox.Show("Printer Name has been saved."); } else { MessageBox.Show("Error: The Printer Name appears to be missing."); } } private async void AppToDevice() { try { // Configure PeerFinder to search for all paired devices. PeerFinder.AlternateIdentities["Bluetooth:Paired"] = ""; var pairedDevices = await PeerFinder.FindAllPeersAsync(); if (pairedDevices.Count == 0) { MessageBox.Show("No paired devices were found."); } else { // Select a paired device. In this example, just pick the first one. PeerInformation selectedDevice = pairedDevices[0]; // Attempt a connection Debug.WriteLine(selectedDevice.DisplayName); // Make sure we are trying to connect to the correct device. //Debug.WriteLine(selectedDevice.HostName.RawName); //Debug.WriteLine(selectedDevice.HostName.IPInformation.NetworkAdapter.NetworkAdapterId.ToString()); //Debug.WriteLine(selectedDevice.ServiceName); StreamSocket socket = new StreamSocket(); // Make sure ID_CAP_NETWORKING is enabled in your WMAppManifest.xml, or the next // line will throw an Access Denied exception. // In this example, the second parameter of the call to ConnectAsync() is the RFCOMM port number, and can range // in value from 1 to 30. await socket.ConnectAsync(selectedDevice.HostName, "1"); string newLabel = App.loadString("Template"); newLabel = newLabel.Replace("$n", "\n"); string epl = App.loadString("PrintHeader"); epl = epl + newLabel; Debug.WriteLine(epl); var data = GetBufferFromByteArray(Encoding.UTF8.GetBytes(epl)); //socket.OutputStream.WriteAsync(data); MessageBox.Show("Device Found."); } } catch (Exception ex) { if ((uint)ex.HResult == 0x8007048F) { var result = MessageBox.Show("Bluetooth is turned off. To see the current Bluetooth settings tap 'ok'", "Bluetooth Off", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { ShowBluetoothcControlPanel(); } } else if ((uint)ex.HResult == 0x80070005) { MessageBox.Show("To run this app, you must have ID_CAP_PROXIMITY enabled in WMAppManifest.xaml"); } else { MessageBox.Show(ex.Message); Debug.WriteLine(ex.StackTrace); Debug.WriteLine(ex.HResult); } } } private IBuffer GetBufferFromByteArray(byte[] package) { using (DataWriter dw = new DataWriter()) { dw.WriteBytes(package); return dw.DetachBuffer(); } } private void ShowBluetoothcControlPanel() { ConnectionSettingsTask connectionSettingsTask = new ConnectionSettingsTask(); connectionSettingsTask.ConnectionSettingsType = ConnectionSettingsType.Bluetooth; connectionSettingsTask.Show(); } private void Button_Click_1(object sender, RoutedEventArgs e) { this.Dispatcher.BeginInvoke(() => { AppToDevice(); }); } } } 

经过多次游戏并将手机重置回原来状态后没有成功。

我在WMAppManifest.xml中勾选了“ID_CAP_PROXIMITY”,它立即开始工作!

看起来我对“ID_CAP_PROXIMITY”的错误代码可能有误,所以这里是代码更新以及我之后遇到的一些错误消息。

我希望这可能有助于有类似问题的人。

 catch (Exception ex) { if ((uint)ex.HResult == 0x8007048F) { var result = MessageBox.Show("Bluetooth is turned off.\nTo see the current Bluetooth settings tap 'ok'", "Bluetooth Off", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { ShowBluetoothcControlPanel(); } } else if ((uint)ex.HResult == 0x8007271D) { //0x80070005 - previous error code that may be wrong? MessageBox.Show("To run this app, you must have ID_CAP_PROXIMITY enabled in WMAppManifest.xaml"); } else if ((uint)ex.HResult == 0x80072740) { MessageBox.Show("The Bluetooth port is already in use."); } else if ((uint)ex.HResult == 0x8007274C) { MessageBox.Show("Could not connect to the selected Bluetooth Device.\nPlease make sure it is switched on."); } else { //App.handleException(ex); MessageBox.Show(ex.Message); } }