对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑
Posted
技术标签:
【中文标题】对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑【英文标题】:Confused as to why Android app crashes and what API levels mean 【发布时间】:2017-06-27 11:43:42 【问题描述】:我最近使用 Xamarin 开发了一个 ios 和 android 应用程序。在我亲自出席的商业活动中,相对少数用户使用了该应用程序。尽管该应用程序在所有 iOS 设备和大多数 Android 设备上都运行了 find,但我有一些 Android 设备的应用程序一直在同一个地方崩溃。我决定提交两份崩溃报告,后来我在 Goole Developer Console 中进行了调查。
原来应用崩溃了:java.lang.NoSuchMethodError: no non-static method "Landroid/view/View;.setForegroundTintList(Landroid/content/res/ColorStateList;)V"
看起来它在调用setForegroundTintList
时崩溃了。我已将我的应用设置为与 API 级别 15 兼容,并且据记录,这仅在 API 级别 21 中可用。所以,给你...
但是等等,不,我提交崩溃报告的设备运行的是 Android 5.0 和 5.1,两者都应该支持 API 级别 21 及更高级别。其中一台设备是三星 Galaxy Core Prime (Android 5.1),另一台是三星 Galaxy S5 (klte),根据崩溃报告,据称运行的是 Android 5.0,尽管开发者控制台列出了它(正在发货??)与 Android 4.0.3 - 4.0.4.
我对 Xamarin 和 Android 开发非常陌生,所以有人可以解释一下吗?以后我应该怎么做才能防止这种情况发生?
为某些关键版本的 Android 设置更多模拟器并在更多模拟器中进行测试?编译器可以为我做些什么。即使我将目标 API 级别降低到 API 级别 15,它也可以正常编译和构建。它不应该抱怨使用目标 API 级别不可用的方法吗?
【问题讨论】:
【参考方案1】:Target Framework
在编译时使用,例如,将其设置为API19
,那么您的ForegroundTintList
属性会收到编译错误:
错误 CS1061:类型
的定义Android.Widget.Button
不包含ForegroundTintList
当然,您将无法使用任何较新的 API,因为它们现在会出现编译器错误。
Minimum Android Version
在运行时使用,因此您需要进行运行时检查以避免在较旧设备 API 级别上失败
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
var x = button.ForegroundTintList;
参考:Understanding Android API Levels
【讨论】:
我已经尝试过了,但它编译得很好(使用 Visual Studio for Mac = Xamarin Studio)。我在Android.Support.V7.Widget.Toolbar
上使用它,因此使用Xamarin.Android.Support.v7.AppCompat
包。这可能解释了为什么它甚至可以编译到 API 级别 15。但它仍然没有解释为什么它不能在这两种特定设备(或 Android 版本)上工作。
抱歉,只是注意到Target framework和Target Android version之间的区别。为链接 +1。以上是关于对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
Android拍照调用系统相册仿微信封装总结,治疗各种崩溃,图片横竖问题压缩等问题。
Android 9 (API 28) 活动在启动时崩溃 (setContentView)