我是移动开发的新手,我一直坚持这个。
以下是要求:从设备中选择一个文件并将其上传到某个API。 我尝试了来自Studyxnet的FilePicker Xamarin插件,但它为从Google驱动器中选择的文件引发了异常。
然后我试着自己做。所以,我需要文件内容(byte [])和文件名。由于这篇文章,我可以通过从ContentResolver获取流来找出内容: Open a Google Drive File Content URI after using KitKat Storage Access Framework
不幸的是,获得这个名字的部分并不适合我。 DISPLAY_NAME和SIZE的列索引均为-1。 ContentResolver.Query返回的ICursor为Empty。它有1列,1行,在getString(0)上它返回null。
我认为这将是一些许可的事情,但无法让它发挥作用。 这是我的代码:
var intent = new Intent();
intent.SetType("*/*");
intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(intent, "Select..."), 2);
OnActivityResult:
protected override async void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
var fileUri = data.Data;
var bytes = await LoadAndConvertToByteArray(fileUri);
var cursor = this.ContentResolver.Query(fileUri, null, null, null, null);
var mimeType = this.ContentResolver.GetType(fileUri); // this works, I can get the mimeType
int nameIndex = cursor.GetColumnIndex(OpenableColumns.DisplayName); // -1
int sizeIndex = cursor.GetColumnIndex(OpenableColumns.Size); // -1
cursor.MoveToFirst();
var fileName = cursor.GetString(nameIndex); // exception
var fileSize = cursor.GetString(sizeIndex); // exception
//cursor.getString(0) returns null
apiservice.UploadFile(fileName, bytes);
}