[英]How to add a sensor to an android widget?
我已经制作了一个简单的加速度计应用程序,并且想要制作一个配套的小部件。 但是每次将传感器添加到widgetprovider时,都会出现以下错误:
07-25 10:31:01.337:E / AndroidRuntime(8908):致命异常:主07-25 10:31:01.337:E / AndroidRuntime(8908):java.lang.RuntimeException:无法启动接收器com.example。 axelo.AxeloAppWidgetProvider:java.lang.NullPointerException 07-25 10:31:01.337:E / AndroidRuntime(8908):at android.app.ActivityThread.handleReceiver(ActivityThread.java:2153)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.app.ActivityThread.access $ 1500(ActivityThread.java:127)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.app.ActivityThread $ H.handleMessage(ActivityThread .java:1208)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.os.Handler.dispatchMessage(Handler.java:99)07-25 10:31:01.337:E / AndroidRuntime(8908) ):位于android.os.Looper.loop(Looper.java:137)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.app.ActivityThread.main(ActivityThread.java:4448)07- 25 10:31:01.337:E / AndroidRuntime(8908):at java.lang.reflect.Method.invokeNative(Native Method)07-25 10:31:01.337:E / AndroidRu ntime(8908):位于java.lang.reflect.Method.invoke(Method.java:511)07-25 10:31:01.337:E / AndroidRuntime(8908):位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller .run(ZygoteInit.java:823)07-25 10:31:01.337:E / AndroidRuntime(8908):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)07-25 10:31 :01.337:E / AndroidRuntime(8908):在dalvik.system.NativeStart.main(本机方法)07-25 10:31:01.337:E / AndroidRuntime(8908):由以下原因引起:java.lang.NullPointerException 07-25 10 :31:01.337:E / AndroidRuntime(8908):位于com.example.axelo.AxeloAppWidgetProvider.onUpdate(AxeloAppWidgetProvider.java:29)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.appwidget。 AppWidgetProvider.onReceive(AppWidgetProvider.java:66)07-25 10:31:01.337:E / AndroidRuntime(8908):位于android.app.ActivityThread.handleReceiver(ActivityThread.java:2146)07-25 10:31:01.337: E / AndroidRuntime(8908):...还有10个
这是我的小部件类的样子
package com.example.axelo;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.TextView;
public class AxeloAppWidgetProvider extends AppWidgetProvider implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mSensor;
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
Log.v("SENSOR_SERVICE","accelerometer found!");
}
else {
Log.v("SENSOR_SERVICE","Not found!");
}
// Create an Intent to launch MainActivity
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.axelo_widget);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// // Show changes on screen.
views.setTextViewText(R.id.coord_X, Float.toString(linear_acceleration[0]));
views.setTextViewText(R.id.coord_Y, Float.toString(linear_acceleration[1]));
views.setTextViewText(R.id.coord_Z, Float.toString(linear_acceleration[2]));
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
float[] gravity={(float) 9.81,(float) 9.81,(float) 9.81};
float[] linear_acceleration=new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
final float alpha = (float) 0.8;
Log.v("SENSOR_SERVICE", "on sensor change");
// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
// Remove the gravity contribution with the high-pass filter.
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
}
请告诉我哪里出问题了,或者没有办法向小部件添加传感器?
我认为传感器小部件将无法以这种方式应用,您应该扩展Activity而不是AppWidgetProvider,并且不要忘记registerListener / unregisterListener,您可以做更多的事情,可以将Activity类添加到小部件清单中,并将代码正常放置在此类中,您可以通过小部件中的setOnClickPendingIntent这个活动的按钮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.