У меня проблема, которую я пытаюсь решить уже более недели, и я просто не могу ее решить. Я пытаюсь сделать очень простое приложение Windows Phone 8.1 с nfc и смарт-картой. Позже я пытаюсь использовать эмуляцию смарт-карты, предоставляемую классом SmartCardEmulator, но на данный момент я просто хочу иметь фоновую задачу, которая делает вещи, когда к ней подключается тэг nfc/смарт-карта. За этот вопрос я сделал совершенно новый проект, который содержит только основы. Программа продолжает сбой, когда я нажимаю кнопку.Windows Phone 8.1 Приложение SmartCard с сбоем фоновой задачи
В начале я сделал телефон пустой ОС Windows App Project и среды выполнения Windows Component, которые я добавил к раствору. Проект приложения для телефона имеет ссылку на проект компонента Windows Runtime.
В MainPage.xaml Я положил только кнопку и текстовое поле.
Класс BackgroundTaskManager находится в проекте приложения для телефона Windows, а класс TaskOne находится в проекте компонента времени выполнения.
В файле Package.appxmanifest я добавил фоновую задачу в декларациях с BackgroundTasks.TaskOne в EntryPoint и системных событий, как типы поддержки задач
В Требований я включил NFC
Ошибки Я получаю при нажатии кнопки:
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.ni.dll
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.ni.dll
A first chance exception of type 'System.UnauthorizedAccessException' occurred in SimpleNfcApp.exe
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.ni.dll
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.ni.dll
Я попытался отладки и поставить POIN перерыв в начале метода RegisterBackgroundTask в BackgroundTaskManager.cs и затем падает в конце DoSomething в MainPage.xaml.cs
Вот sourecodes:
MainPage.xaml.cs
namespace SimpleNfcApp
{
public sealed partial class MainPage : Page
{
public MainPage() {
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
}
protected override void OnNavigatedTo(NavigationEventArgs e) {
}
// method put on a button
private async void doSomething(object sender, TappedRoutedEventArgs e)
{
String taskName = BackgroundTaskManager.TaskOneName;
bool isActive = isTaskActive(taskName);
if(isActive == false) {
startTask();
} else {
myTextBox.Text = "Task already active";
}
}
// starts a task
private async void startTask()
{
var trigger = new SmartCardTrigger(SmartCardTriggerType.EmulatorNearFieldEntry);
var task = BackgroundTaskManager.RegisterBackgroundTask(BackgroundTaskManager.TaskOneEntryPoint,
BackgroundTaskManager.TaskOneName,
trigger,
null);
await task;
myTextBox.Text += task.Result.ToString();
}
// checks if the task is already active
private static bool isTaskActive(String name)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == name)
return true;
}
return false;
}
}
}
BackgroundTaskManager.cs
namespace SimpleNfcApp
{
class BackgroundTaskManager
{
public const string TaskOneEntryPoint = "BackgroundTasks.TaskOne";
public const string TaskOneName = "TaskOne";
public static string TaskOneProgress = "";
public static bool TaskOneRegistered = false;
// creates and registers the task
public static async Task<BackgroundTaskRegistration> RegisterBackgroundTask(String taskEntryPoint, String taskName, IBackgroundTrigger taskTrigger, IBackgroundCondition taskCondition)
{
if (TaskRequiresBackgroundAccess(taskName))
await BackgroundExecutionManager.RequestAccessAsync();
var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(taskTrigger);
BackgroundTaskRegistration task = builder.Register();
var settings = ApplicationData.Current.LocalSettings;
settings.Values.Remove(taskName);
return task;
}
// checks if it is a windows phone app or a simple windows app
public static bool TaskRequiresBackgroundAccess(String name)
{
#if WINDOWS_PHONE_APP
return true;
#else
#endif
}
}
}
TaskOne.cs
namespace BackgroundTasks
{
public sealed class TaskOne
{
IBackgroundTaskInstance _taskInstance;
BackgroundTaskDeferral _deferral;
public async void Run(IBackgroundTaskInstance taskInstance)
{
_taskInstance = taskInstance;
_deferral = taskInstance.GetDeferral();
int x;
x = 2 + 2;
_deferral.Complete();
}
}
}
Кто-нибудь увидеть, что я делаю неправильно? Спасибо за чтение. Greez, Скиппи
EDIT:
Я добавил блок поймать попробовать вокруг метода DoSomething в MainPage.xaml.cs и получил новое сообщение более выразительный об ошибке.
A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.ni.dll
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Windows.ApplicationModel.Background.BackgroundTaskBuilder.Register()
at SimpleNfcApp.BackgroundTaskManager.<RegisterBackgroundTask>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at SimpleNfcApp.MainPage.<startTask>d__0.MoveNext() Second exception caught.
Кроме того, когда я меняю триггер в doSomething перед регистрацией задачи, он работает. Я попробовал это один:
//var trigger = new SmartCardTrigger(SmartCardTriggerType.EmulatorNearFieldEntry);
var trigger = new SystemTrigger(SystemTriggerType.ServicingComplete, false);