2014-07-25 2 views
0

나는 간단한 가속도계 앱을 만들었으며 동반자 위젯을 만들고 싶습니다. 그러나 모든 시간을 내 widgetprovider에 센서를 추가 나는 다음과 같은 오류 얻을 :Android 위젯에 센서를 추가하는 방법은 무엇입니까?

07-25 10:31:01.337: E/AndroidRuntime(8908): FATAL EXCEPTION: main 07-25 10:31:01.337: E/AndroidRuntime(8908): java.lang.RuntimeException: Unable to start receiver 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): at android.app.ActivityThread.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 android.os.Looper.loop(Looper.java:137) 07-25 10:31:01.337: E/AndroidRuntime(8908): at 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/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.ZygoteInit.main(ZygoteInit.java:590) 07-25 10:31:01.337: E/AndroidRuntime(8908): at dalvik.system.NativeStart.main(Native Method) 07-25 10:31:01.337: E/AndroidRuntime(8908): Caused by: 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 android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:66) 07-25 10:31:01.337: E/AndroidRuntime(8908): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2146) 07-25 10:31:01.337: E/AndroidRuntime(8908): ... 10 more

이 내 위젯 클래스는

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];   
    }  

} 

내게 알려주십시오처럼 내가 잘못거야 어디 보이거나이 무엇을 위젯에 센서를 추가 할 방법이 없습니까?

답변

0

센서 위젯이 이런 식으로 적용되지 않을 것이라고 생각합니다. AppWidgetProvider 대신 Activity를 확장하고 registerListener/unregisterListener를 잊지 마세요. 위젯 매니페스트에 활동 클래스를 추가하고 코드를 삽입 할 수있는 뭔가를 더 많이 할 수 있습니다. 이 클래스는 정상적으로, 위젯에서 setOnClickPending이 Activity로 버튼을 지정할 수 있습니다.