android - 无法创建服务 java.lang.NullPointerException

标签 android android-intent android-service phone-state-listener

我实现了一个 sensorEventListener,它在摇动时改变铃声模式。我正在使用一项服务,以便我可以随时从 Activity 外部更改铃声模式。这是我正在使用的服务的代码-

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

编辑 - 再次实例化 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)

最佳答案

sensorManager 未初始化。您在 onCreate()

中缺少类似的内容
sensorManager=(SensorManager) getSystemService(...);

关于android - 无法创建服务 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17648393/

相关文章:

android - 似乎无法更新表面叠加层中的 TextView

java - Android持续运行服务

android - 如何在应用程序崩溃时添加发送反馈选项?

java - DatabaseException : Can't convert object of type java. lang.Long 类型(Model.class)

android - 从 WSDL 中查找 SOAPAction

android - 将消息正文和电话号码发送到 Viber

android - 如何通过 ContentProvider URI 获取从 Gallery 发送到我的应用程序的视频的实际路径?

android - 我如何为 Android 应用程序编写 SQLite 查询?

java - Android 多个快捷键

java - 即使在强制停止之后,Google 日历或 Instagram 如何使他们的应用程序始终启动并运行