c# - Windows Phone 8 蓝牙错误 HRESULT : 0x8007271D

标签 c# bluetooth windows-phone-8

我一直在尝试开发我的 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

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

代码一直运行到这一点:

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

然后它因以下异常而中断:

********** 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.<AppToDevice>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(Object state)
********** EXCEPTION OCCURED **********

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

我已经按照教程中的说明尝试了从 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);
                }
            }

关于c# - Windows Phone 8 蓝牙错误 HRESULT : 0x8007271D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833507/

相关文章:

c# - 正则表达式 IsMatch 随机无法匹配模式

macos - 如何通过 IOBluetooth 框架 (macOS) 获取 BLE 设备列表

iphone - 苹果的MFi计划

javascript - cordova 插件 ble-central 的问题

c# - 使用 Async 和 Await 转换普通的 Http Post Web 请求

c# - C#8“默认”是什么?对泛型类型做什么?

c# - UWP XAML BladeView 控件 - 将新创建的 BladeItem 滚动到 View 中

c# - 如何解决无法将 System.Data.Datatable 隐式转换为 int 的问题?

c# - 异步加载 ViewModel 中的数据(使用 async 和 await)不使用数据绑定(bind)

cordova - jquery mobile位置固定在Windows Phone 8和视口(viewport)高度