0

加速度センサーを監視し、TTS を使用して特定の値が測定されたときに何かを言うプログラムをサービスで作成しました。デバイスがオンのときはすべて正常に動作しますが、スリープ状態になると正しく動作する場合もあれば、しばらくすると動作する場合もあれば、電源ボタンを押してデバイスをスリープ解除するのと同じように動作する場合もあれば、まったく動作しない場合もあります。アイデアはありますか?

public class MyService extends Service implements SensorEventListener, OnInitListener {

    private SensorManager SenMan;
    private Sensor AccSen;
    private TextToSpeech mTTS = null;
    private PowerManager pm;
    private WakeLock wl;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        SenMan = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        AccSen = SenMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        SenMan.registerListener(this, AccSen, SensorManager.SENSOR_DELAY_NORMAL);
        pm = (PowerManager)getSystemService(POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG");
    }

    @Override
    public void onDestroy() {
        SenMan.unregisterListener(this);
        super.onDestroy();
    }

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

    @Override
    public final void onSensorChanged(SensorEvent event) {
        double a = Math.sqrt(Math.pow(event.values[0], 2) + Math.pow(event.values[1], 2) + Math.pow(event.values[2], 2));
        if (Math.abs(a - 9.8) / 0.98 > 25) Say();
    }

    private void Say() {
        wl.acquire();
        mTTS = new TextToSpeech(this, this);        
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS)
            mTTS.speak("Text to say", TextToSpeech.QUEUE_FLUSH, null);
        wl.release();
    }
}
4

1 に答える 1

-1

デバイスがスリープ状態の場合、TTS は機能しません。TTS は、デバイスの電源がオフになっている場合、バッテリーが取り外されている場合、または大ハンマーで粉々に砕かれている場合にも機能しません。TTSAlarmManager、電源ボタンでウェイクアップするか、他の何か (電話の着信など)によってデバイスがウェイクアップしている場合に機能します。

OS のバージョンとデバイスの製造元によっては、デバイスがスリープ状態のときにセンサーが機能する場合と機能しない場合があります。

したがって、デバイスを起動状態に保つために を使用する必要があるかWakeLock(かなりのバッテリー コストがかかります)、別のアプリのアイデアを考え出す必要があります。

于 2013-05-19T19:41:39.277 に答える