Xamarin - Android - ContentResolver.Query为Google Drive内容Uri返回一个空的Cursor

时间:2017-02-09 15:23:04

标签: android xamarin xamarin.android

我是移动开发的新手,我一直坚持这个。

以下是要求:从设备中选择一个文件并将其上传到某个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);
}

0 个答案:

没有答案