我有一些在Android上選擇文件的代碼。我在某處從網上挑選它。實際上,代碼在一種情況下工作,但在我的應用程序中,它不起作用。 Android認爲用戶在實際沒有的時候已經取消了文件選擇。Xamarin Android - FilePickerActivity - 無理由取消
下面的代碼:
private Task<FileData> PickAndOpenFile(bool isSave)
{
var id = GetRequestId();
var ntcs = new TaskCompletionSource<FileData>(id);
if (Interlocked.CompareExchange(ref _CompletionSource, ntcs, null) != null)
{
throw new InvalidOperationException("Only one operation can be active at a time");
}
try
{
var pickerIntent = new Intent(_Context, typeof(FilePickerActivity));
pickerIntent.SetFlags(ActivityFlags.NewTask);
_Context.StartActivity(pickerIntent);
EventHandler<FilePickerEventArgs> handler = null;
EventHandler<EventArgs> cancelledHandler = null;
handler = (s, e) =>
{
var tcs = Interlocked.Exchange(ref _CompletionSource, null);
FilePickerActivity.FilePicked -= handler;
Stream fileStream = isSave ? File.OpenRead(e.FilePath) : File.OpenWrite(e.FilePath);
tcs?.SetResult(new FileData { FileName = e.FileName, FileStream = fileStream });
};
cancelledHandler = (s, e) =>
{
var tcs = Interlocked.Exchange(ref _CompletionSource, null);
FilePickerActivity.FilePickCancelled -= cancelledHandler;
tcs?.SetResult(null);
};
FilePickerActivity.FilePickCancelled += cancelledHandler;
FilePickerActivity.FilePicked += handler;
}
catch (Exception exAct)
{
Debug.Write(exAct);
}
return _CompletionSource.Task;
}
看到這正常運行,請複製此回購和運行Android樣品。選擇文件示例位於第二個選項卡上。 https://github.com/MelbourneDeveloper/Adapt.Presentation.git
但是,在我的應用程序,我有整整像這樣使用相同的代碼:
var filePicker = App.PlatformSpecificStartupArguments.PresentationFactory.CreateFilePicker();
using (var fileData = await filePicker.PickAndOpenFileForReading())
{
if (fileData == null)
{
return;
}
using (var readFileStream = fileData.FileStream)
{
var fileExtension = Path.GetExtension(fileData.FileName);
var relativeUri = Guid.NewGuid() + fileExtension;
await OnPictureTakenAsync(this, new PictureTakenEventArgs(readFileStream, relativeUri, fileData.FileName));
}
}
但是,當我拿起文件(選擇從現有圖像的圖像),代碼進入cancelledHandler代替。這顯然是一個權限問題,因爲我得到的設備日誌此錯誤消息:
08-02 15:15:28.697 LGE的Nexus 5X錯誤18911個DatabaseUtils java.lang.SecurityException異常:權限拒絕:閱讀com.android。 providers.media.MediaProvider uri content:// media/external/images/media from pid = 18684,uid = 10221需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission() at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java: 608) at android.content.ContentProvider $ Transport.enforceReadPermission(ContentProvider.java:483) at android.content.ContentProvider $ Transport.query(ContentProvider.java:212) at android.content.ContentProviderNative.onTransact(ContentProviderNati ve.java:112) 在android.os.Binder.execTransact(Binder.java:565)
於是,我打開在Visual Studio的級別此權限在我的Android清單,但問題仍然存在。我針對的失敗的Android版本是6.0。您可以看到,在上面提到的回購中,目標版本設置爲「使用SDK版本進行編譯」。而且我還沒有將READ_EXTERNAL_STORAGE添加到該示例應用程序。
@Melbourne開發者,你有沒有解決問題了嗎? –
謝謝。你的文章引導我回到我的最終答案。我一直在使用James Montemontagno的代碼來做這件事,但是這段代碼並不是要求準備就緒,所以我編輯了這段代碼來解決這個問題。我會寫另一篇文章,並提出完整的解決方案。 –