部署在 Xamarin.Android 中制作的 APK 时出现此错误(来 self 设备的 Logcat)
>*android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
at MyApp.InvoiceActivity.SendJson (System.String Json, System.String Route, System.String Token) [0x00053] in <f72bff8dbb074291a532e12425c8737a>:0
at MyApp.InvoiceActivity.OnCreate (Android.OS.Bundle bundle) [0x0004a] in <f72bff8dbb074291a532e12425c8737a>:0
at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <0181fdcaff164e668b24279eb4fb429f>:0
at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.1(intptr,intptr,intptr)
at crc64df67992c1ed0ef67.InvoiceActivity.n_onCreate(Native Method)
at crc64df67992c1ed0ef67.InvoiceActivity.onCreate(Unknown Source:0)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)*
此错误表明我的问题从 sendJson() 方法开始,这是此方法的片段
public string SendJson(string Json, string Route = "MyRoute", string Token = "MyToken")
{
try
{
using var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
client.Headers[HttpRequestHeader.Authorization] = "Token token=" + Token;
string response = client.UploadString(Route, "POST", Json);
return response;
}
catch (WebException ex)
{
var response = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
return response;
}
}
但是,只有当应用程序是从导出的 APK 安装并执行时才会发生此错误。当我使用 Visual Studio 调试器时,该方法运行良好。
我尝试将该方法放入一个独立的类中或 Activity 内部(甚至将部分方法放入 onCreate() 方法中),更改级别访问权限,但没有任何效果。
编辑
感谢大家的回答并给我一些关于这个问题的想法。经过一些测试后,我发现当在项目属性的编译部分启用“优化代码”时会出现问题。在 Xamarin.Android 中,要导出签名的 APK,您需要首先将项目设置为“发布”模式才能实现此目的,当然,默认情况下会启用此选项。我不确定这是编译器的错误还是只是我的错,所以我会继续调查:)。不管怎样,再次非常感谢您的帮助。
最佳答案
最后问题是一样的:应用程序在调试中工作,同时在发布中(特别是在导出的 apk 中)应用程序无法工作。经过一番挖掘,我发现发生这种情况是因为 AndroidManifest 通过调试拥有所有权限。在导出 apk 之前,我们需要通过(在我的例子中)VisualStudio 显式设置所需的权限。例如,在我的应用程序中,需要互联网连接来执行一些 API 调用和文件访问来存储返回的数据(文件或数据库上的数据持久性),这意味着我们在“真实”AndroidManifest 中需要 ACCESS_NETWORK_STATE 和 WRITE_EXTERNAL_STORAGE,因此设置了权限AndroidManifest 和...应用程序仍然无法工作。
在 API 调用代码中获取 Saamer 答案的一部分会引发异常:无法到达服务器。基本上,该应用程序由于某种原因无法连接到服务器。一开始还不清楚,从 WebClient 切换到 RestSharp 会抛出代码 0(无或未连接)。考虑到这一点,在 Xamarin 文档中找到了答案:默认支持和允许的权限 ( https://learn.microsoft.com/en-us/xamarin/essentials/permissions?context=xamarin%2Fandroid&tabs=android )。因此,需要请求 ACCESS_NETWORK_STATE 和 WRITE_EXTERNAL_STORAGE,因为我们的 AndroidManifest 中默认不允许它们。我知道这是一个可怕的错误,但这是我的第一个应用程序,所以也许这可以帮助面临类似情况的其他人。感谢您的帮助。
关于c# - 通过调试器部署时该方法可以正常工作,但导出 APK 时相同的方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62941623/