c# - 通过调试器部署时该方法可以正常工作,但导出 APK 时相同的方法不起作用

标签 c# rest xamarin xamarin.android

部署在 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/

相关文章:

android - 旋转设备时 RecyclerView/MapView 崩溃

android - 未找到 Xamarin ZipAlign

c# - 代码不断吃内存

c# - 自创建数据库以来,支持 '--Context' 上下文的模型已更改 - 但 db 是新的生产数据库

c# - 我使用哪种方法?

java - Jersey 客户端 API 与 Jersey 测试框架

java - 如何为现有站点创建 Restful 服务

c# - 我应该在 ServiceController 上调用 Close() 吗?

ios - 带有 CoreData 和分页的 RestKit

java - 为什么绑定(bind)项目中没有生成某些类?