Я использовал Plugin.FilePicker
для выбора файлов с устройства. Он отлично работал на Android версии 11 и ниже. Но на версии Android 12 и выше он ломается за исключением следующего:
Java.Lang.NullPointerException: uri в Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualObjectMethod (экземпляр Java.Interop.JniObjectReference, тип Java.Interop.JniObjectReference, метод Java.Interop.JniMethodInfo, аргументы Java.Interop.JniArgumentValue*) [0x00088] в /Users/runner/work /1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/JniEnvironment.g.cs:11928 в Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeNonvirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, параметры Java.Interop.JniArgumentValue*) [0x0001e] в /Users/runner/work/1/s/xamarin-android/ внешний/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:894 в Android.Content.ContentResolver.Query (Android.Net.Uri uri, проекция System.String[], выбор System.String, System.String[] selectionArgs, System.String sortOrder) [0x000a0] в /Users/runner/work /1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-33/mcw/Android.Content.ContentResolver.cs:1456 в Plugin.FilePicker.IOUtil.GetDataColumn (контекст Android.Content.Context, Android.Net.Uri uri, выбор System.String, System.String[] selectionArgs) [0x00013] в D:\a\1\s\src\ Плагин.FilePicker\Android\IOUtil.android.cs:151 в Plugin.FilePicker.IOUtil.GetPath (контекст Android.Content.Context, Android.Net.Uri uri) [0x00167] в D:\a\1\s\src\Plugin.FilePicker\Android\IOUtil.android.cs: 108 at Plugin.FilePicker.FilePickerActivity.OnActivityResult (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x00039] в D:\a\1\s\src\Plugin.FilePicker\Android\FilePickerActivity .android.cs:151 --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в Plugin.FilePicker.FilePickerImplementation.PickFile (System.String [] allowTypes) [0x00028] в D:\a\1\s\src\Plugin.FilePicker\Android\FilePickerImplementation.android.cs:60 в QatarBrain.ConnectAppModule.CreateActivityPage.PickFile (отправитель System.Object, аргументы System.EventArgs) [0x00075] в: 0 --- Конец управляемой трассировки стека Java.Lang.NullPointerException --- java.lang.NullPointerException: uri в java.util.Objects.requireNonNull (Objects.java: 245) в android.content.ContentResolver.query(ContentResolver.java:1225) в android.content.ContentResolver.query(ContentResolver.java:1184) в android.content.ContentResolver.query(ContentResolver.java:1140) at crc64424a8adc5a1fbe28.FilePickerActivity.n_onActivityResult (собственный метод) в crc64424a8adc5a1fbe28.FilePickerActivity.onActivityResult(FilePickerActivity.java:48) в android.app.Activity.dispatchActivityResult(Activity.java:8840) в android.app.ActivityThread.deliverResults(ActivityThread.java:5694) в android.app.ActivityThread.handleSendResult(ActivityThread.java:5740) в android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) в android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) в android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2458) в android.os.Handler.dispatchMessage(Handler.java:106) на android.os.Looper.loopOnce(Looper.java:233) на android.os.Looper.loop(Looper.java:334) в android.app.ActivityThread.main(ActivityThread.java:8501) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
Я проверил наличие обновлений для Plugin.FilePicker
и обнаружил, что пакет устарел. Поэтому я установил пакет Xamarin.Essentials
и обновил коды для выбора файлов. Он отлично работает на Android версии 12 и выше.
Xamarin.Essentials.FileResult file = null;
file = await FilePicker.PickAsync();
if (file != null)
{
filename_label.IsVisible = true;
filename_label.Text = file.FileName;
upload_layout.IsVisible = true;
}
Но когда я пытаюсь загрузить файл с помощью нашего REST API, он терпит неудачу со следующим исключением:
System.IO.FileNotFoundException: привет-мэри.pdf Имя файла: 'радуйся-мария.pdf' ---> Java.IO.FileNotFoundException: радуйся-мария.pdf в Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (экземпляр Java.Interop.JniObjectReference, метод Java.Interop.JniMethodInfo, аргументы Java.Interop.JniArgumentValue*) [0x00068] в /Users/runner/work/1/s/xamarin- android/external/Java.Interop/src/Java.Interop/obj/Release/JniEnvironment.g.cs:11524 в Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractObjectMethod (System.String encodedMember, параметры Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue*) [0x0001e] в /Users/runner/work/1/s/xamarin-android/ внешний/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:848 в Android.Content.Res.AssetManager.Open (System.String fileName) [0x0001f] в /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-33 /mcw/Android.Content.Res.AssetManager.cs:265 в Xamarin.Essentials.FileSystem.PlatformOpenAppPackageFileAsync (имя файла System.String) [0x0001d] в D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.android.cs:48 --- Конец управляемой трассировки стека Java.IO.FileNotFoundException --- java.io.FileNotFoundException: привет-мэри.pdf в android.content.res.AssetManager.nativeOpenAsset (собственный метод) в android.content.res.AssetManager.open(AssetManager.java:893) в android.content.res.AssetManager.open(AssetManager.java:870) at crc64ee486da937c010f4.ButtonRenderer.n_onClick (собственный метод) в crc64ee486da937c010f4.ButtonRenderer.onClick(ButtonRenderer.java:107) в android.view.View.performClick(View.java:7512) в android.view.View.performClickInternal(View.java:7489) на android.view.View.access$3700(View.java:857) в android.view.View$PerformClick.run(View.java:29034) в android.os.Handler.handleCallback(Handler.java:938) в android.os.Handler.dispatchMessage(Handler.java:99) на android.os.Looper.loopOnce(Looper.java:233) на android.os.Looper.loop(Looper.java:334) в android.app.ActivityThread.main(ActivityThread.java:8501) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068) в Xamarin.Essentials.FileSystem.PlatformOpenAppPackageFileAsync (имя файла System.String) [0x00036] в D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.android.cs:52 в Xamarin.Essentials.FileSystem.OpenAppPackageFileAsync (имя файла System.String) [0x00000] в D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.shared.cs:16 в QatarBrain.ConnectAppModule.CreateActivityPage.UploadFile (отправитель System.Object, System.EventArgs e) [0x00126] в <8fb254ba200e4d369cb3f96cc3e665ff>:0
Загрузить код:
var content = new MultipartFormDataContent();
Stream stream = await FileSystem.OpenAppPackageFileAsync(file.FileName);
byte[] data;
using (MemoryStream ms = new MemoryStream())
{
stream.CopyTo(ms);
data = ms.ToArray();
ms.Dispose();
}
content.Add(new StreamContent(stream), "\"fileUpload\"", $"\"{file.FullPath}\"");
var httpClient = new HttpClient();
var response = await httpClient.PostAsync(new Uri(REST API Path), content);
file.FullPath
указан в коде загрузки, но получает FileNotFoundException.
@Jason Пробовал оба ваших предложения, но без изменений
какая конкретная строка вызывает исключение?
@Jason Номер строки не отображается; когда я нажимаю кнопку загрузки файла, я получаю это исключение. К сожалению, отладчики не бьют.
затем пройдитесь по каждой строке кода в отладчике, пока не столкнетесь с исключением
@Jason Получил ответ из темы ниже, не могли бы вы добавить его в качестве своего ответа Learn.Microsoft.com/en-us/answers/questions/1144327/…
Поскольку Джейсон не вернулся, и в качестве резюме я опубликую здесь ответ по ссылке, которой поделился Шриджит Шри, чтобы он помог другим, у кого есть похожие проблемы. Большое спасибо за вашу поддержку MAUI. :)
Если вы используете FilePicker.PickAsync();
для получения файла, вам не нужно использовать Stream stream = await FileSystem.OpenAppPackageFileAsync(file.FullPath);
для его чтения в потоковом режиме.
Просто используйте Stream stream = await file.OpenReadAsync();
напрямую, тогда вы сможете получить поток.
Используйте FileName вместо FullPath или просто полностью исключите этот необязательный параметр.