当前位置: 首页 > 知识库问答 >
问题:

如何向android小部件添加传感器?

孙才捷
2023-03-14

我做了一个简单的加速度计应用程序,我想做一个配套的小部件。但是每次向widgetprovider添加传感器时,都会出现以下错误:

07-25 10:31:01.337:E/AndroidRuntime(8908):致命异常:main 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)Read.Access$1500(ActivityThread.java:127)07-25 10:31:01.337:E/AndroidRuntime(8908):at Android.app.ActivityThread$H.HandleMessage(ActivityThread.java:1208)07-25 10:31:01.337:E/AndroidRuntime(8908):at Android.os.handler.DispatchMessage(handler.java:99)07-25 10:31:01.337:E/AndroidRuntime(8908):at 8908):at android.app.activitythread.main(activitythread.java:4448)07-25 10:31:01.337:e/androidruntime(8908):at java.lang.reflect.Method.invokenative(本机方法)07-25 10:31:01.337:e/androidruntime(8908):at java.lang.reflect.Method.invoke(Method.java:511)07-25 10:31:01.337:e/androidruntime(8908):at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:823)07-25 10:31:01.337:e/androidruntime(8908):at com.android.internal.os.zygoteinite.java:590)07-25 10:31:01.337:at.main(本机方法)07-25 10:31:01.337:e/AndroidRuntime(8908):原因:java.lang.nullPointerException 07-25 10:31:01.337:e/AndroidRuntime(8908):at com.example.axelo.axeloAppWidgetProvider.onUpdate(AxeloAppWidgetProvider.java:29)07-25 10:31:01.337:e/AndroidRuntime(8908):at 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];        
    }       

}

请告诉我哪里出错了,还是没有办法向小部件添加传感器?

共有1个答案

葛成双
2023-03-14

我认为传感器小部件不适用这种方式,您应该扩展Activity而不是AppWidgetProvider,不要忘记RegisterListener/UnRegisterListener,您还可以做更多的事情您可以将Activity类添加到小部件清单中,并将代码正常地放在该类中,您可以从widget中为该活动设置一个按钮ClickPendingIntent。

 类似资料:
  • 我使用的是flatter,我想给一个小部件添加一个边框(在本例中是widget)。 我尝试了和,但没有看到如何添加边框。

  • 问题内容: 我想在JDialog中添加诸如TextField,Button等组件。 问题答案: 1)首先创建一个Jpanel 2)将组件添加到该JPanel 3)创建JDialog 4)将JPanel添加到JDialog

  • 直到最近,我还只是在使用一个简单的Java项目。我最近决定将其升级为使用gradle包装器和NetBeans12,但现在该程序无法检测beep3.wav文件。 我看过这个、这个和很多其他的页面,但是没有一个关于向jar添加文件的信息,所以我假设我正在寻找错误的信息。 你能帮个忙吗?我只需要获得wav文件,以便在构建项目时自动插入到jar中。

  • 问题内容: 我如何在tkinter窗口小部件居中的情况下向tkinter窗口添加填充?我试过了: 和 我只想在标签顶部填充30像素。 问题答案: 填充选项和的和方法可利用一个 2元组 表示左/右和上/下填充。 这是一个例子:

  • 问题内容: 我正在使用一个简单的消息传递系统,并且需要将以下内容添加到Tkinter文本小部件中: 拼写检查 更改字体的选项(在选定的文本上) 更改字体颜色的选项(在选定的文本上) 更改字体大小的选项(在选定的文本上) 我了解tkinter文本小部件可以通过标记机制使用多种字体和颜色,但是我不知道如何利用这些功能。 如何使用“文本”小部件的功能实现这些功能?具体来说,如何更改字体系列,单词的颜色和

  • 我想问一下,我如何在我的应用程序中动态添加一些小部件,一个接一个,而不是一次添加完。这些小部件被添加到包含命令的for循环中,并由按钮触发。所以我想知道是否有办法在执行结束时逐渐显示输出,而不是一次显示完。起初,我试图在for循环中添加延迟,但恐怕这与每次构建输出的方式有关。 编辑:嗯,似乎我没有很好地理解和的用法,所以我对他们(或time.sleep)的尝试没有成功在所有。但显然,这是我问题的解