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

강제로 응용 프로그램을 열면 코드가 닫힙니다. 로그캣은 다음을 표시합니다. -

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 

편집 - 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

초기화 알람 관리자 '오전' –

+1

감사합니다. 이제 작동합니다. :) btw AudioManager. – Naddy

1

은 - 스택 추적 당신은 당신이 그것을 인스턴스화 한 경우 현재는하는 null 참조를 보유의 SensorManager 참조 변수를 선언? 던질 것이다이 null 참조에 어떤 메서드를 호출

private SensorManager sensorManager; 

NullPointerException A :

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

을하더라도 AudioManager am;null을 의미하여, 당신이 필요로 : 당신은 onCreate()에 초기화 할 필요가

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

메소드를 호출하기 전에 초기화하십시오.

+0

응답을위한 감사합니다. 네가 한 말대로했다. 인스턴스를 만든 후에는 다시 NullPointerException을 제공합니다. – Naddy

+0

스택 트레이스를 제공합니까? – NINCOMPOOP

+0

나는 질문을 편집했다. – Naddy

2

sensorManager 변수를 초기화하십시오.

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

나는 지금 질문을 편집했다. 한번 봐주세요. – Naddy

관련 문제