Reputation: 3671
I was using Plugin.FilePicker
to pick files from the device. It was working fine on android version 11 and below. But on android version 12 and above, it is breaking with below exception:
Java.Lang.NullPointerException: uri at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00088] in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/JniEnvironment.g.cs:11928 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeNonvirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0001e] in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:894 at Android.Content.ContentResolver.Query (Android.Net.Uri uri, System.String[] projection, System.String selection, System.String[] selectionArgs, System.String sortOrder) [0x000a0] in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-33/mcw/Android.Content.ContentResolver.cs:1456 at Plugin.FilePicker.IOUtil.GetDataColumn (Android.Content.Context context, Android.Net.Uri uri, System.String selection, System.String[] selectionArgs) [0x00013] in D:\a\1\s\src\Plugin.FilePicker\Android\IOUtil.android.cs:151 at Plugin.FilePicker.IOUtil.GetPath (Android.Content.Context context, Android.Net.Uri uri) [0x00167] in 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] in D:\a\1\s\src\Plugin.FilePicker\Android\FilePickerActivity.android.cs:151 --- End of stack trace from previous location where exception was thrown --- at Plugin.FilePicker.FilePickerImplementation.PickFile (System.String[] allowedTypes) [0x00028] in D:\a\1\s\src\Plugin.FilePicker\Android\FilePickerImplementation.android.cs:60 at CatholicBrain.ConnectAppModule.CreateActivityPage.PickFile (System.Object sender, System.EventArgs args) [0x00075] in :0 --- End of managed Java.Lang.NullPointerException stack trace --- java.lang.NullPointerException: uri at java.util.Objects.requireNonNull(Objects.java:245) at android.content.ContentResolver.query(ContentResolver.java:1225) at android.content.ContentResolver.query(ContentResolver.java:1184) at android.content.ContentResolver.query(ContentResolver.java:1140) at crc64424a8adc5a1fbe28.FilePickerActivity.n_onActivityResult(Native Method) at crc64424a8adc5a1fbe28.FilePickerActivity.onActivityResult(FilePickerActivity.java:48) at android.app.Activity.dispatchActivityResult(Activity.java:8840) at android.app.ActivityThread.deliverResults(ActivityThread.java:5694) at android.app.ActivityThread.handleSendResult(ActivityThread.java:5740) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2458) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:334) at android.app.ActivityThread.main(ActivityThread.java:8501) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
I checked for any updates for Plugin.FilePicker
and found that the package is deprecated. So I installed the Xamarin.Essentials
package and updated codes for picking files. It is working fine on android version 12 and above.
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;
}
But when I try to upload the file using our REST API it fails with below exception:
System.IO.FileNotFoundException: hail-mary.pdf File name: 'hail-mary.pdf' ---> Java.IO.FileNotFoundException: hail-mary.pdf at Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00068] in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/JniEnvironment.g.cs:11524 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0001e] in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:848 at Android.Content.Res.AssetManager.Open (System.String fileName) [0x0001f] in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-33/mcw/Android.Content.Res.AssetManager.cs:265 at Xamarin.Essentials.FileSystem.PlatformOpenAppPackageFileAsync (System.String filename) [0x0001d] in D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.android.cs:48 --- End of managed Java.IO.FileNotFoundException stack trace --- java.io.FileNotFoundException: hail-mary.pdf at android.content.res.AssetManager.nativeOpenAsset(Native Method) at android.content.res.AssetManager.open(AssetManager.java:893) at android.content.res.AssetManager.open(AssetManager.java:870) at crc64ee486da937c010f4.ButtonRenderer.n_onClick(Native Method) at crc64ee486da937c010f4.ButtonRenderer.onClick(ButtonRenderer.java:107) at android.view.View.performClick(View.java:7512) at android.view.View.performClickInternal(View.java:7489) at android.view.View.access$3700(View.java:857) at android.view.View$PerformClick.run(View.java:29034) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:334) at android.app.ActivityThread.main(ActivityThread.java:8501) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068) at Xamarin.Essentials.FileSystem.PlatformOpenAppPackageFileAsync (System.String filename) [0x00036] in D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.android.cs:52 at Xamarin.Essentials.FileSystem.OpenAppPackageFileAsync (System.String filename) [0x00000] in D:\a_work\1\s\Xamarin.Essentials\FileSystem\FileSystem.shared.cs:16 at CatholicBrain.ConnectAppModule.CreateActivityPage.UploadFile (System.Object sender, System.EventArgs e) [0x00126] in <8fb254ba200e4d369cb3f96cc3e665ff>:0
Upload Code:
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
is provided on the upload code but getting FileNotFoundException.
Upvotes: 0
Views: 492
Reputation: 13803
If you use FilePicker.PickAsync();
to get the file, you do not need to use Stream stream = await FileSystem.OpenAppPackageFileAsync(file.FullPath);
to read it to stream.
Just use Stream stream = await file.OpenReadAsync();
directly, then you can get the stream.
Upvotes: 1