2017-10-03 1 views
0

Windows 10 데스크톱에서 실행되는 UWP 앱 샌드 박스에서 파일을 공유하려고합니다.UWP DataTransferManager ShowShareUI() "이 앱을 지금 공유 할 수 없습니다."라는 대화 상자가 열리고 즉시 닫습니다.

이 페이지의 MS 설명서를 따르면 구현은 매우 간단합니다. 그러나, 나는 데 문제

https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data 나는 기사의 설명에 따라 내 클래스의 C-토르에서 DataTransferManager와 연결된 DataRequested 이벤트를 생성 : 백그라운드 스레드에서 호출

DataTransferManager dataTransferManager; 

public MainPage() 
{ 
    this.InitializeComponent(); 
    ... 
    dataTransferManager = DataTransferManager.GetForCurrentView(); 
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 
} 

방법에서 다음을, , 나는 그것이 메인 쓰레드 내 OnDataRequested 경우에 그런

Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
{ 
    DataTransferManager.ShowShareUI(); //THIS CALL SHOWS A POPUP AND IMMEDIATELLY CLOSES IT 
}).AsTask().Wait(); 

에서 실행해야합니다 ShowShareUI 만드는 전화, 내가 공유 할 파일을 추가합니다

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    // get the file from application sandbox 
    StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@"C:\Users\ME\AppData\Local\Packages\f040f23f-....-84\LocalState\logs\MYLOG.log"); 
    DataRequest request = args.Request; 
    request.Data.Properties.Title = "My Log File"; 
    request.Data.Properties.Description = "Sharing MYLOG file."; 
    List<IStorageItem> storage = new List<IStorageItem>() 
    { 
     attachmentFile 
    }; 
    request.Data.SetStorageItems(storage); 
} 

하지만 아무 일도 발생하지 않습니다. 나는 대화 상자에서 1/2 초 동안 열리고 닫힌 어떤 것도 선택할 기회가 없었습니다. 다음은 대화 상자의 모습입니다. 열어 본 직후에 열리고 닫히기 때문에 "이 앱은 지금 공유 할 수 없습니다"라고 표시됩니다.

enter image description here

답변

1

내 문제에 대한 해결책은 다음과 같습니다. MainPage.xaml.cs를에

추가 된 전역 변수 : MainPage의 생성자에서

private DataTransferManager dataTransferManager; 

는이

dataTransferManager = DataTransferManager.GetForCurrentView(); 
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 

지금까지 내 코드가 변경되지 않은 추가되었지만 다음에 전화를 온다 ShowShareUI와 그 호출은 원래 백그라운드 스레드에서 호출되었지만 Dispatcher를 사용하여 UI 스레드로 발송되었습니다 (원래 게시물 참조). 나는 아직도 내가 원래 설명했던 것처럼 그것을하는 것이 왜 작동하지 않는지 알지 못한다. 그러나 아래처럼 코드를 변경 한 후에, 지금 작동 중이다.이 해결했다

private async void DataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    DataRequestDeferral deferral = args.Request.GetDeferral(); 

    // MyLogger has SendLogs method but calling this in Button_Click above will not work and the Share 
    // dialog will just open and close. Moving it down to this event solves the issue. 
    MyLogger.SendLogs(async logpath => 
    { 
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
     { 
      StorageFile myFile = await StorageFile.GetFileFromPathAsync(logpath); 

      DataRequest request = args.Request; 
      request.Data.Properties.Title = "Share My Logs"; 
      request.Data.Properties.Description = string.Format("Share log file {0}.", myFile.DisplayName); 

      List<IStorageItem> myStorageItems = new List<IStorageItem>() { myFile }; 
      request.Data.SetStorageItems(myStorageItems); 
      deferral.Complete(); 
     }); 
    }); 
} 

+0

동일한 문제가있었습니다. ** request.FailWithDisplayText() ** – Adriano

+0

이 문제와 어떻게 관련이 있습니까? Tx – pixel

1

StorageFile attachmentFile는 = StorageFile.GetFileFromPathAsync을 기다리고 있습니다 ("@ C : \ 사용자의 AppData \ 로컬 \ 패키지 \ ME를 \ \ f040f23f -....- 84 \ LocalState \ 로그 \ MYLOG.log ");

UWP에서는 경로에서 직접 파일을 가져올 수 없습니다.

UWP 앱은 샌드 박스로 실행되며 파일 시스템에 대한 액세스가 제한됩니다. 대부분의 경우 설치 폴더와 응용 프로그램 데이터 폴더에만 직접 액세스 할 수 있습니다. 다른 곳의 파일 시스템에 액세스 할 수있는 권한이 없습니다. 당신은 여전히 ​​얼굴 경우

StorageFolder logsFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync("logs"); 
StorageFile file = await logsFolder.GetFileAsync("MYLOG.log"); 

코드를 변경하고 다시 응용 프로그램을 실행 해보세요보고 : 롭은 다음과 같은 것이 Skip the path: stick to the StorageFile

그래서, 당신의 코드와 같이 변경됩니다 자신의 블로그에이 점을 설명하고있다 이 문제.

+0

하지만 내 문제 :이 이벤트 핸들러가 ShowShareUI()에 위의 호출에 의해 트리거됩니다

private void Button_Click() { DataTransferManager.ShowShareUI(); } 

: 그래서, UI 스레드에서 버튼 클릭에서 공유 시작 위의 경우, 앱 응용 프로그램 데이터 폴더 (샌드 박스)에있는 파일에 액세스하고 있습니다. 내가 제공 한 경로는 앱 샌드 박스의 경로입니다. 그 작품과 나는 그것을 알고 있기 때문에 먼저 응용 프로그램 저장소에서 메일 애플 리케이션에서만 작동하지만 내 경우에 사용할 수 없게 만드는 다른 Win32 응용 프로그램과 함께 작동하지 않는지 알기 위해 파일을 새로운 이메일에 첨부하려고했기 때문에 그것을 알고 있습니다. 따라서 여기에서 파일을 제대로 액세스하고 검색하고 있습니다. 고마워 – pixel

+0

... btw, 같은 문제가 당신이 제안한 것처럼 코드를 변경할 때 존재합니다. ShowShareUI() 호출은 공유 대화 상자를 열지 만 이벤트 OnDataRequested()가 입력 될 때까지 (중단 점) 대화 상자가 이미 닫힙니다. 차이점이 없습니다. – pixel

관련 문제