4

我實現了一個sensorEventListener,它在搖動時更改了振鈴模式。我正在使用一項服務,以便我可以隨時改變活動外的鈴聲模式。這是我使用的服務代碼 -無法創建服務java.lang.NullPointerException

package com.nadeem.shakeit; 

import android.app.Service; 
import android.content.Intent; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.media.AudioManager; 
import android.os.IBinder; 

public class service extends Service implements SensorEventListener { 
private SensorManager sensorManager; 
private long lastUpdate; 
AudioManager am; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    sensorManager.registerListener(this, 
      sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

/*@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent == null) { 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_NORMAL); 
    } 
    return Service.START_REDELIVER_INTENT; 
}*/ 
@Override 
public void onDestroy() { 
    sensorManager.unregisterListener(this); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     getAccelerometer(event); 
    } 

} 

private void getAccelerometer(SensorEvent event) { 
    float[] values = event.values; 
    // Movement 
    float x = values[0]; 
    float y = values[1]; 
    float z = values[2]; 

    float accelationSquareRoot = (x * x + y * y + z * z) 
      /(SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH); 
    long actualTime = System.currentTimeMillis(); 
    if (accelationSquareRoot >= 5) // 
    { 
     if (actualTime - lastUpdate < 200) { 
      return; 
     } 
     lastUpdate = actualTime; 
     int ringerMode = am.getRingerMode(); 
     if (ringerMode == AudioManager.RINGER_MODE_NORMAL) { 
      am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
     } else if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { 
      am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
     } else { 
      am.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
     } 
    } 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO for communication return IBinder implementation 
    return null; 
} 
} 

當我打開應用程序時,它強制關閉。 Logcat顯示: -

07-15 12:04:02.800: E/AndroidRuntime(22092): FATAL EXCEPTION: main 
07-15 12:04:02.800: E/AndroidRuntime(22092): java.lang.RuntimeException: Unable to  create service com.nadeem.shakeit.service: java.lang.NullPointerException 
07-15 12:04:02.800: E/AndroidRuntime(22092): at  android.app.ActivityThread.handleCreateService(ActivityThread.java:2076) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.app.ActivityThread.access$2500(ActivityThread.java:123) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.os.Looper.loop(Looper.java:130) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.app.ActivityThread.main(ActivityThread.java:3835) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at java.lang.reflect.Method.invokeNative(Native Method) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at java.lang.reflect.Method.invoke(Method.java:507) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at dalvik.system.NativeStart.main(Native Method) 
07-15 12:04:02.800: E/AndroidRuntime(22092): Caused by: java.lang.NullPointerException 
07-15 12:04:02.800: E/AndroidRuntime(22092): at com.nadeem.shakeit.service.onCreate(service.java:21) 
07-15 12:04:02.800: E/AndroidRuntime(22092): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2066) 
07-15 12:04:02.800: E/AndroidRuntime(22092): ... 10 more 

Edit-After再次實例化sensorManager我得到一個nullPointerException。堆棧跟蹤是 -

07-15 12:35:45.280: E/AndroidRuntime(22469): FATAL EXCEPTION: main 
07-15 12:35:45.280: E/AndroidRuntime(22469): java.lang.NullPointerException 
07-15 12:35:45.280: E/AndroidRuntime(22469): at com.nadeem.shakeit.service.getAccelerometer(service.java:64) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at com.nadeem.shakeit.service.onSensorChanged(service.java:43) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:529) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at android.os.Looper.loop(Looper.java:130) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at android.app.ActivityThread.main(ActivityThread.java:3835) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at java.lang.reflect.Method.invokeNative(Native Method) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at java.lang.reflect.Method.invoke(Method.java:507) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-15 12:35:45.280: E/AndroidRuntime(22469): at dalvik.system.NativeStart.main(Native Method) 

回答

6

sensorManager未初始化。你缺少這樣的東西在你的onCreate()

sensorManager=(SensorManager) getSystemService(...); 
+0

看看編輯! – Naddy

+1

初始化該報警管理器'am' –

+1

非常感謝。它現在有效。 :)順便說一下它的一個AudioManager。 – Naddy

1

你剛纔宣佈SensorManager參考變量,它目前持有null參考,在這裏你實例化了嗎?

private SensorManager sensorManager; 

調用此null參考任何方法將拋出NullPointerException

sensorManager.registerListener(this, 
     sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
     SensorManager.SENSOR_DELAY_NORMAL); 

需要初始化它onCreate()

sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 

即使你AudioManager am;null,你需要在調用任何方法之前對其進行初始化。

+0

謝謝你的答案。我做了你所說的。在實例化之後,它再次給出一個NullPointerException。 – Naddy

+0

給我們堆棧跟蹤? – NINCOMPOOP

+0

我編輯了這個問題。 – Naddy

2

初始化您的sensorManager變量。

sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
+0

我現在編輯了這個問題。請看一看。 – Naddy

相關問題