2015-03-27 5 views
0

У меня проблема, которую я пытаюсь решить уже более недели, и я просто не могу ее решить. Я пытаюсь сделать очень простое приложение 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); 

ответ

0

U получили код ошибки там

var settings = ApplicationData.Current.LocalSettings; 
settings.Values.Remove(taskName); 

ApplicationData.Current.LocalSettings - для этого доступа к файлам запрещен.