Java 将已安装的小部件添加到我的Android活动时出错
我试图允许我的启动器添加一个自定义安装的小部件,就像股票启动器一样 我的代码没有显示任何错误,但当我运行应用程序时,它会在此活动中崩溃 这是它显示的错误Java 将已安装的小部件添加到我的Android活动时出错,java,android,android-widget,android-appwidget,android-launcher,Java,Android,Android Widget,Android Appwidget,Android Launcher,我试图允许我的启动器添加一个自定义安装的小部件,就像股票启动器一样 我的代码没有显示任何错误,但当我运行应用程序时,它会在此活动中崩溃 这是它显示的错误 03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ Late-enabling -Xcheck:jni 03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ VMHOOK: rlim_cur :
03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ Late-enabling -Xcheck:jni
03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ VMHOOK: rlim_cur : 0 pid:4576
03-11 15:13:56.023 4576-4586/com.example.easylauncher I/art﹕ Debugger is no longer active
03-11 15:13:56.133 4576-4576/com.example.easylauncher D/Atlas﹕ Validating map...
03-11 15:13:56.193 4576-4595/com.example.easylauncher I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.03.00
Build Date: 12/11/14 Thu
Local Branch:
Remote Branch: refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030
Local Patches: NONE
Reconstruct Branch: NOTHING
03-11 15:14:00.983 4576-4576/com.example.easylauncher E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.easylauncher, PID: 4576
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.easylauncher/com.example.easylauncher.AdvancedActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.appwidget.AppWidgetHost.allocateAppWidgetId()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.appwidget.AppWidgetHost.allocateAppWidgetId()' on a null object reference
at com.example.easylauncher.AdvancedActivity.<init>(AdvancedActivity.java:56)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1083)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
03-11 15:13:55.993 4576-4576/com.example.easylancher I/art﹕ 延迟启用-Xcheck:jni
03-11 15:13:55.993 4576-4576/com.example.easylauncher I/art﹕ VMHOOK:rlim_cur:0 pid:4576
03-11 15:13:56.023 4576-4586/com.example.easylauncher I/art﹕ 调试器不再处于活动状态
03-11 15:13:56.133 4576-4576/com.example.easylauncher D/Atlas﹕ 正在验证映射。。。
03-11 15:13:56.193 4576-4595/com.example.easylauncher I/Adreno EGL﹕ : EGL 1.4高通公司构建:AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030_发布版_AU()
OpenGL ES着色器编译器版本:E031.25.03.00
建造日期:2014年11月12日星期四
本地分行:
远程分支:refs/tags/AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030
本地修补程序:无
重建分支:没有
03-11 15:14:00.983 4576-4576/com.example.easylauncher E/AndroidRuntime﹕ 致命异常:主
进程:com.example.easylancher,PID:4576
java.lang.RuntimeException:无法实例化活动组件信息{com.example.easylauncher/com.example.easylauncher.AdvancedActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int-android.appwidget.AppWidgetHost.allocateAppWidgetId()”
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
在android.app.ActivityThread.access$800(ActivityThread.java:144)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:155)
位于android.app.ActivityThread.main(ActivityThread.java:5696)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.appwidget.AppWidgetHost.allocateAppWidgetId()”
位于com.example.easylancher.AdvancedActivity。(AdvancedActivity.java:56)
位于java.lang.reflect.Constructor.newInstance(本机方法)
位于java.lang.Class.newInstance(Class.java:1572)
位于android.app.Instrumentation.newActivity(Instrumentation.java:1083)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2312)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
在android.app.ActivityThread.access$800(ActivityThread.java:144)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:155)
位于android.app.ActivityThread.main(ActivityThread.java:5696)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
这是我的代码:
public class AdvancedActivity extends Activity {
DrawerAdapter drawerAdapterObject;
GridView drawerGrid;
SlidingDrawer slidingDrawer;
RelativeLayout homeView;
class Pac{
Drawable icon;
String name;
String packageName;
String label;
}
Pac[] pacs;
PackageManager pm;
static boolean appLaunchable = true;
Button widgetButton;
AppWidgetManager appWidgetManager;
AppWidgetHost appWidgetHost;
AppWidgetProviderInfo newAppWidgetProviderInfo = new AppWidgetProviderInfo();
// Get an id
int appWidgetId = appWidgetHost.allocateAppWidgetId();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced);
drawerGrid = (GridView) findViewById(R.id.content);
slidingDrawer = (SlidingDrawer) findViewById(R.id.drawer);
homeView = (RelativeLayout) findViewById(R.id.home_view);
pm =getPackageManager();
set_pacs();
slidingDrawer.setOnDrawerOpenListener(new SlidingDrawer.OnDrawerOpenListener() {
@Override
public void onDrawerOpened() {
appLaunchable=true;
}
});
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
registerReceiver(new PacReceiver(), filter);
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, 1);
addwidgetButtonListener();
}
public void show (){
ListView listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this, R.layout.dialog_list, new String[]{"Themes", "Settings", "Help"}));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
// arg0 is your adapter, arg1 is the view clicked, arg2 is the position and arg3 is the id.
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
switch(arg2){
case(1): //change 0 for themes 1 for advanced 2 for help
Intent intent= new Intent(AdvancedActivity.this,SettingsActivity.class);
startActivity(intent);
break;
case(0):
Toast.makeText(getApplicationContext(), "Coming soon!", Toast.LENGTH_SHORT).show();
break;
case(2):
Toast.makeText(getApplicationContext(), "Coming soon!", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
});
Dialog dialog = new Dialog(this);
dialog.setTitle("Settings");
dialog.setContentView(listView);
dialog.show();
}
final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent m) {
//enter long press here
show();
}
});
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
public void set_pacs(){
Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pacsList = pm.queryIntentActivities(mainIntent, 0);
pacs = new Pac[pacsList.size()];
for(int I=0;I<pacsList.size();I++){
pacs[I]= new Pac();
pacs[I].icon=pacsList.get(I).loadIcon(pm);
pacs[I].packageName=pacsList.get(I).activityInfo.packageName;
pacs[I].name=pacsList.get(I).activityInfo.name;
pacs[I].label=pacsList.get(I).loadLabel(pm).toString();
}
new SortApps().exchange_sort(pacs);
drawerAdapterObject = new DrawerAdapter(this, pacs);
drawerGrid.setAdapter(drawerAdapterObject);
drawerGrid.setOnItemClickListener(new DrawerClickListener(this, pacs, pm));
//for long click drawerGrid.setOnItemLongClickListener(new DrawerLongClickListener(this, slidingDrawer, homeView,pacs));
}
public class PacReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
set_pacs();
}
}
public void createwidget(){
// Get the list of installed widgets
List<AppWidgetProviderInfo> appWidgetInfos = new ArrayList<AppWidgetProviderInfo>();
appWidgetInfos = appWidgetManager.getInstalledProviders();
// Create Widget
AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, newAppWidgetProviderInfo);
hostView.setAppWidget(appWidgetId, newAppWidgetProviderInfo);
// Add it to your layout
RelativeLayout rl = (RelativeLayout) findViewById(R.id.home_view);
rl.addView(hostView);
}
public void addwidgetButtonListener() {
widgetButton = (Button) findViewById(R.id.button);
widgetButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
createwidget();
}
});
}
}
公共类AdvancedActivity扩展活动{
付款人付款人对象;
GridView抽屉网格;
滑动抽屉滑动抽屉;
相对论家庭观;
Pac类{
可绘制图标;
字符串名;
字符串封装名称;
字符串标签;
}
Pac[]pacs;
包装经理;
静态布尔appLaunchable=true;
按钮widgetButton;
AppWidgetManager AppWidgetManager;
AppWidgetHost AppWidgetHost;
AppWidgetProviderInfo newAppWidgetProviderInfo=新建AppWidgetProviderInfo();
//取得身份证
int-appWidgetId=appWidgetHost.allocateAppWidgetId();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced);
DroperGrid=(GridView)findViewById(R.id.content);
slidingDrawer=(slidingDrawer)findViewById(R.id.drawer);
homeView=(RelativeLayout)findViewById(R.id.home\u视图);
pm=getPackageManager();
set_pacs();
slidingDrawer.setOnDrawerOpenListener(新的slidingDrawer.OnDrawerOpenListener(){
@凌驾
公开作废已作废(){
appLaunchable=true;
}
});
IntentFilter=newintentfilter();
filter.addAction(Intent.ACTION\u PACKAGE\u ADDED);
filter.addAction(Intent.ACTION\u PACKAGE\u已删除);
filter.addAction(Intent.ACTION\u PACKAGE\u已更改);
filter.addDataScheme(“包”);
registerReceiver(新的PacReceiver(),过滤器);
appWidgetManager=appWidgetManager.getInstance(此);
appWidgetHost=新的appWidgetHost(这个,1);
addwidgetButtonListener();
}
公开展览(){
ListView ListView=新建ListView(此);
setAdapter(新的ArrayAdapter(这个,R.layout.dialog_列表,新的字符串[]{“Themes”,“Settings”,“Help”});
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
//arg0是适配器,arg1是单击的视图,arg2是位置,arg3是id。
int appWidgetId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced);
//.. other code
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, 1);
appWidgetId = appWidgetHost.allocateAppWidgetId()