我正在开发一个Android appwidget,它在我尝试的所有Android版本(模拟器1.5,1.6,2.3)中工作正常,但不是2.1(物理设备,LG GT540升级到2.1)。我在三星GT I5801上测试了它与2.1操作系统一起开箱即用,可能因为特别修改了2.1版本更旧(或者三星自己添加了修复)。
顺便说一下,我认为这是我所指的确切错误的解决方法:
https://android.googlesource.com/platform/packages/apps/Settings/+/7be5137e12ba58cebae634f640379599acdb491a
这是一个讨论相同问题的旧线程: Android:NPE while trying to activityForResult with ACTION_APPWIDGET_PICK intent
当我尝试在主屏幕上加载小部件时(实际上当我单击“小部件”按钮时会发生这种情况)我收到以下错误:
应用程序设置(进程com.android.settings)已停止 不料。请再试一次。
使用“强制关闭”按钮。
请参阅下面的logcat输出。顺便说一下,当我的appwidget还没有安装时,这种情况也不会发生,而且它也发生在2.1模拟器上。
我到处搜寻,有很多人提到这一点。开发人员,但主要是用户,一般的结论是它是android 2.1操作系统中的一个错误。例如,即使谷歌自己的地图appwidget也会导致此次崩溃。
现在我知道有些appwidget在2.1上工作正常。所以必须有一个解决方法。我只是不知道是什么。我已经在这里阅读了建议(抱歉我现在找不到链接),appwidget需要多个小部件才能让它工作。我现在实际上有2个文本视图,但我也试过一个textview和一个图像按钮。两者都不起作用。
我当然可以避免使用2.1,但我宁愿这个appwidget能够处理尽可能多的Android版本(而且我还不能升级我的GT540),此外我不愿意接受失败。 : - )
Logcat stacktrace:
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}
清单:
<?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>
答案 0 :(得分:1)
我建议您仔细检查应用程序清单,因为您的窗口小部件应用程序似乎导致选择器在您的应用程序实际实例化之前死亡。此时,清单就是正在使用的所有内容。你的应用程序元素应该有一个带有intent过滤器的接收器,它可以处理android.appwidget.action.APPWIDGET_UPDATE,并且在receiver元素中有一个声明提供者资源的元数据元素。
答案 1 :(得分:0)
这个问题前一段时间自动消失了。其他地方建议的工作是在appwidget中有多个小部件。我确实这样做了但问题仍然存在。但后来消失了。我一直在扩展我的appwidget添加功能和另一个小部件(这使得3)。
如果我找时间,我会仔细检查我的修订版,看看问题在哪一点消失了。然后我希望能够更好地回答我自己的问题而不是“只需添加更多东西,直到它自己修复”。 ; - )