web-dev-qa-db-ja.com

Android=

私のアプリはダイヤラーであり、ユーザーが電話を頭の近くに持っているときは、画面をオフにして、コントロールのクリックを防ぐ必要があります-ネイティブAndroidダイヤラーの動作など。私はこれを正しい方法で行いますか?

21
Solkin

非常に有名なVoIPアプリケーションを1つ分解することで解決策を見つけました。ボタン1を押した後のこのアクティビティは、センサーを閉じたときに画面とハードウェアキーを無効にします。 button2を押すと、この機能はオフになります。

また、この機能には権限が必要です。

<uses-permission Android:name="Android.permission.WAKE_LOCK" />

アクティビティ。それを試してみてください。

public class MainActivity extends Activity {

    private Button button1;
    private Button button2;
    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    private int field = 0x00000020;

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

        try {
            // Yeah, this is hidden field.
            field = PowerManager.class.getClass().getField("PROXIMITY_SCREEN_OFF_WAKE_LOCK").getInt(null);
        } catch (Throwable ignored) {
        }

        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(field, getLocalClassName());

        setContentView(R.layout.main);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);

        button1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(!wakeLock.isHeld()) {
                    wakeLock.acquire();
                }
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if(wakeLock.isHeld()) {
                    wakeLock.release();
                }
            }
        });
    }
}
43
Solkin

次のコードは、近接センサーの使用方法を示しています。

public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mProximity;

 @Override
 public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// Get an instance of the sensor service, and use that to get an instance of
// a particular sensor.
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
 }

 @Override
 public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
 }

 @Override
  public final void onSensorChanged(SensorEvent event) {
   float distance = event.values[0];
// Do something with this sensor data.
   }

 @Override
 protected void onResume() {
// Register a listener for the sensor.
super.onResume();
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
 }

 @Override
  protected void onPause() {
// Be sure to unregister the sensor when the activity pauses.
super.onPause();
mSensorManager.unregisterListener(this);
 }}

顔が画面に近いときに近接センサーを使用するには、 this リンクを試してください。画面をオフにします。

これがお役に立てば幸いです。

3
i.n.e.f

Solakeがポストしたメソッド(wakelockを使用)を試すと、CPU使用率が高くなるデバイスがたくさんあります。これはAndroidデバイスのバグです。

問題を回避するには、onSensorChangedイベントを使用し、黒い画面を表示するだけです。

2
justingregoryuk