1

私は VOIP アプリを開発しており、以下に示すように PROXIMITY_SCREEN_OFF_WAKE_LOCK ウェイクロックを使用しています。

多くのデバイスで、近接センサーがオンのときに画面が真っ暗になると、アプリのオーディオ再生が停止することに気付きました。これは、HTC、LG、および Huawei デバイスで発生します。

センサーがトリガーされたときにオーディオ再生が停止するのを防ぐために、何か追加する必要がありますか? Skype などの他の VOIP アプリでも同じ問題が発生していることに気付きました。

int PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32;    
mProximityWakeLock = pm.newWakeLock(PROXIMITY_SCREEN_OFF_WAKE_LOCK, "myLock");
if(!mProximityWakeLock.isHeld()){
    mProximityWakeLock.acquire();
}

どうもありがとう!

4

1 に答える 1

8

私たちは同じ問題を抱えていました。私たちが実際に検出したのは、WakeLockで画面がオフになっているときに入力ソケットがデータの受信を停止したため、AudioTrackにゼロを送信していたことです。

これを改善するために、PROXIMITY_SCREEN_OFF_WAKE_LOCKの使用をやめ、SensorManagerを使用しています(Linphoneコードを調べました)。

public class InCallActivity extends Activity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mProximity;

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

    public void onSensorChanged(SensorEvent event) {
        final Window window = getWindow();
        WindowManager.LayoutParams lAttrs = getWindow().getAttributes();
        View view = ((ViewGroup) window.getDecorView().findViewById(android.R.id.content)).getChildAt(0);
        if (event.values[0] > 4) {
            // turn on screen
            Log.v("LlamadaActivity", "Encendemos pantalla");
            lAttrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
            view.setVisibility(View.VISIBLE);
        }
        else {
            // turn off screen
            Log.v("LlamadaActivity", "Apagamos pantalla");
            lAttrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
            view.setVisibility(View.INVISIBLE);
        }
        window.setAttributes(lAttrs);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);

        // Para que la pantalla no se apague, y que la encienda aunque este apagada y bloqueada
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        //
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mSensorManager.unregisterListener(this);
    }
}
于 2012-10-05T09:18:04.640 に答える