c# - android NullPointerException:尝试调用虚拟方法 - 空对象引用
问题描述
不知道为什么我收到错误。让我知道如何解决此错误?我假设,它是一个覆盖问题或 android 流问题。希望有人能指出我正确的方向
我得到的完整错误是:
error Java.Lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <94b04e1756104d1fa1d144932ae2720c>:0
at Android.Runtime.JNIEnv.CallVoidMethod (System.IntPtr jobject, System.IntPtr jmethod, Android.Runtime.JValue* parms) [0x00000] in /Users/builder/azdo/_work/278/s/xamarin-android/src/Mono.Android/Android.Runtime/JNIEnv.g.cs:264
at Com.Theartofdev.Edmodo.Cropper.CropImage+ActivityBuilder.Start (Android.App.Activity p0) [0x00048] in <658bb62a76e541a59bbd18d879a75b72>:0
at Test02_IDWalletCard.Droid.ImageCropperImplementation.ShowFromFile (Test02_IDWalletCard.Library.ImageCropper imageCropper, System.String imageFile) [0x000a1] in C:\Users\ikhla\source\repos\Test02_IDWalletCard\Test02_IDWalletCard\Test02_IDWalletCard.Android\ImageCropperImplementation.cs:42
--- End of managed Java.Lang.NullPointerException stack trace ---
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:130)
at android.content.Intent.setClass(Intent.java:9891)
at com.theartofdev.edmodo.cropper.CropImage$ActivityBuilder.getIntent(CropImage.java:471)
at com.theartofdev.edmodo.cropper.CropImage$ActivityBuilder.getIntent(CropImage.java:463)
at com.theartofdev.edmodo.cropper.CropImage$ActivityBuilder.start(CropImage.java:486)
at mono.java.lang.RunnableImplementor.n_run(Native Method)
at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
错误在线:
activityBuilder.Start(CrossCurrentActivity.Current.Activity);
这是完整的错误代码。它进入 catch 块。所以错误是 ShowFromFile() 方法中的 activityBuilder :
namespace Test02_IDWalletCard.Droid
{
public class ImageCropperImplementation : IImageCropperWrapper
{
public void ShowFromFile(ImageCropper imageCropper, string imageFile)
{
try
{
CropImage.ActivityBuilder activityBuilder = CropImage.Builder(Android.Net.Uri.FromFile(new Java.IO.File(imageFile)));
if (imageCropper.CropShape == ImageCropper.CropShapeType.Oval)
{
activityBuilder.SetCropShape(CropImageView.CropShape.Oval);
}
else
{
activityBuilder.SetCropShape(CropImageView.CropShape.Rectangle);
}
...
activityBuilder.Start(CrossCurrentActivity.Current.Activity);
}
catch (Exception ex)
{
Debug.WriteLine("================================================"+ex.ToString());
}
}
}
}
其他一些信息。这是一个中间类平台。主要是在活动结果上运行
namespace Test02_IDWalletCard.Droid
{
public class Platform
{
public static void Init()
{
DependencyService.Register<IImageCropperWrapper, ImageCropperImplementation>();
}
public static async void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
if (requestCode == CropImage.CropImageActivityRequestCode)
{
CropImage.ActivityResult result = CropImage.GetActivityResult(data);
// small delay
await System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(100));
if (resultCode == Result.Ok)
{
ImageCropper.Current.Success?.Invoke(result.Uri.Path);
}
else if ((int)resultCode == (int)(CropImage.CropImageActivityResultErrorCode))
{
ImageCropper.Current.Faiure?.Invoke();
}
}
}
}
}
MainActivity.cs:我在哪里调用平台类。它没有达到顶部的 catch 块的 OnActivityResult() bc 。
[Activity(Label = "Test02_IDWalletCard", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
Platform.Init();
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
Platform.OnActivityResult(requestCode, resultCode, data);
}
}
}
解决方案
推荐阅读
- symfony - 嵌套 CollectionType - 一种创建多个实体的表单
- sbml - 什么是系统生物学标记语言?
- vue.js - 如何支持我的 SPA NuxtJS 应用程序的社交媒体共享和预览
- java - 如何膨胀合并
- java - 尝试使用 if 语句在 Java for 循环中创建 10 列
- java - 安装为 apk 时,retrofit2 连接会引发错误
- python - 在远程桌面中使用 pywinrm 启动分离的进程
- postgresql - Postgres 与 ORDER BY 和 Equals 与 IN 的碰撞行为
- php - 在 websocket 中向终端创建的 codeanywhere.com 网站服务器发送 bash 命令
- html - 如何将网络上的图像添加到我的 html 网站?