我正在开发一个 android appwidget,它在我尝试过的所有 android 版本(模拟器 1.5、1.6、2.3)中都运行良好,但在 2.1(物理设备,LG GT540 升级到 2.1)中运行良好。我在装有 2.1 操作系统的三星 GT I5801 上对其进行了测试,它可以正常工作,这可能是因为 2.1 版本的特定修订版本较旧(或者三星自己添加了修复程序)。
顺便说一句,我认为这是对我所指的确切错误的修复:
https://android.googlesource.com/platform/packages/apps/Settings/+/7be5137e12ba58cebae634f640379599acdb491a
这是一个讨论相同问题的旧线程: Android:NPE while trying to activityForResult with ACTION_APPWIDGET_PICK intent
当我尝试在主屏幕上加载小部件时(实际上它发生在我单击“小部件”按钮时)我收到以下错误:
The application Settings (process com.android.settings) has stopped unexpectedly. Please try again.
带有“强制关闭”按钮。
请参阅下面的 logcat 输出。顺便说一句,当我的 appwidget 还没有安装时,这不会发生,它也会发生在 2.1 模拟器上。
我到处搜索,有很多人提到这个。开发人员,但主要是用户,一般的结论是它是 android 2.1 操作系统中的一个错误。例如,即使是谷歌自己的 map 应用小部件也会导致此崩溃。
现在我知道有些 appwidgets 在 2.1 上运行良好。所以必须有一个变通办法。我只是不知道是什么。我已阅读此处的建议(抱歉,我现在找不到链接)appwidget 需要多个小部件才能使其正常工作。我现在实际上有 2 个 TextView ,但我也尝试使用一个 TextView 和一个图像按钮。两者都不起作用。
我当然可以避免使用 2.1,但我更希望这个 appwidget 可以在尽可能多的 android 版本上运行(而且我目前还不能升级我的 GT540),而且我不愿意接受失败。 :-)
Logcat 堆栈跟踪:
I/ActivityManager( 58): Starting activity: Intent { act=android.appwidget.action.APPWIDGET_PICK cmp=com.android.settings/.AppWidgetPickActivity (has extras) }
W/InputManagerService( 58): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44d5d458
D/AndroidRuntime( 229): Shutting down VM
W/dalvikvm( 229): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 229): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 229): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.AppWidgetPickActivity}: java.lang.NullPointerException
E/AndroidRuntime( 229): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
E/AndroidRuntime( 229): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime( 229): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime( 229): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime( 229): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 229): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 229): at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 229): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 229): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 229): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 229): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 229): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 229): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 229): at com.android.settings.ActivityPicker$IconResizer.createIconThumbnail(ActivityPicker.java:364)
E/AndroidRuntime( 229): at com.android.settings.ActivityPicker$PickAdapter$Item.<init>(ActivityPicker.java:226)
E/AndroidRuntime( 229): at com.android.settings.AppWidgetPickActivity.putAppWidgetItems(AppWidgetPickActivity.java:185)
E/AndroidRuntime( 229): at com.android.settings.AppWidgetPickActivity.putInstalledAppWidgets(AppWidgetPickActivity.java:226)
E/AndroidRuntime( 229): at com.android.settings.AppWidgetPickActivity.getItems(AppWidgetPickActivity.java:207)
E/AndroidRuntime( 229): at com.android.settings.ActivityPicker.onCreate(ActivityPicker.java:98)
E/AndroidRuntime( 229): at com.android.settings.AppWidgetPickActivity.onCreate(AppWidgetPickActivity.java:63)
E/AndroidRuntime( 229): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 229): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
E/AndroidRuntime( 229): ... 11 more
I/Process ( 58): Sending signal. PID: 229 SIG: 3
I/dalvikvm( 229): threadid=7: reacting to signal 3
I/dalvikvm( 229): Wrote stack trace to '/data/anr/traces.txt'
E/ActivityThread( 58): Failed to find provider info for android.server.checkin
E/Checkin ( 58): Error reporting crash: java.lang.IllegalArgumentException: Unknown URL content://android.server.checkin/crashes
W/ActivityManager( 58): Activity idle timeout for HistoryRecord{44c1fd30 com.android.settings/.AppWidgetPickActivity}
list :
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="net.example.exampleapp"
android:versionCode="1"
android:versionName="1.0"
android:debuggable="true">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:label="exampleapp">
<receiver
android:name="ExampleWidgetProvider" >
<intent-filter>
<action
android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
最佳答案
我建议您非常仔细地检查应用程序 list ,因为您的小部件应用程序似乎导致选择器在您的应用程序实际实例化之前就死掉了。那时 list 就是正在使用的所有内容。您的应用程序元素应该有一个接收器,该接收器带有一个处理 android.appwidget.action.APPWIDGET_UPDATE 的 Intent 过滤器,并且在接收器元素内有一个声明提供者资源的元数据元素。
关于Android appwidget 在 android v2.1 上崩溃进程 com.android.settings,需要解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083634/