具有唤醒问题的接近传感器:无法再次打开屏幕

时间:2013-01-29 00:22:56

标签: android sensor proximity wakelock

我一直在寻找最后的日子,所提问题的答案都没有帮助我,而且我正在用一些可能很容易解决的东西碰到我的脑袋......我想和接近传感器和我正在做的是,如果我把手指放在传感器上,它会关闭屏幕,如果我将手指移开,它会转回屏幕!我成功地关闭了屏幕,我得到了“Log.i(”信息“,”试图打开!“)”当我移开手指但是屏幕无法打开时的消息......我已经尝试过wakelock(评论)和没有成功的旗帜!如果我取下手指,键盘上的指示灯会亮,但屏幕不会亮。如果我按两次电源按钮,它会成功打开屏幕!谁能帮我一个忙吗? :(

@Override
public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType()==Sensor.TYPE_PROXIMITY){
    ProximityReading.setText("\nProximity Sensor Reading:" + String.valueOf(event.values[0]));
    }

        if(event.values[0] == 0) {
      WindowManager.LayoutParams params = getWindow().getAttributes();
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
      params.screenBrightness = 0f;
      getWindow().setAttributes(params);
            } else {
          WindowManager.LayoutParams params = getWindow().getAttributes();
      params.screenBrightness = 1f;
      getWindow().setAttributes(params);

      /*powermanager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powermanager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
      wakeLock.acquire();

      Log.i("info", "trying to turn on!");

    }
}

3 个答案:

答案 0 :(得分:0)

如果你想打开屏幕,你可以使用诸如" TurnScreenOn"等API。在PowerManager中,或使用ACQUIRE_CAUSES_WAKEUP结合FULL_WAKE_LOCK

答案 1 :(得分:0)

我使用以下方法解锁手机,将其点亮,然后重新启用键盘锁。

public void unlockAndPowerup(){
    KeyguardManager km = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
    final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock");
    kl.disableKeyguard();

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");

    wakeLock.acquire();
    wakeLock.release();
    kl.reenableKeyguard();
}

答案 2 :(得分:0)

你的程序错了。它可能偶然在某些设备上运行,但这不是它的方法。

  1. FLAG_TURN_SCREEN_ON 应该应用于活动的onCreate方法。您需要修改您的应用逻辑。

  2. 您的屏幕关闭技术不正确。您正在修改亮度,这是一种愚蠢的方式,并且可能根本不关闭屏幕,并且耗尽电池电量。 您需要通过“设备管理员”权限来实现它。这是正式的做法

  3. 锁定示例代码

    public static void lockNow(Context c) {
        DevicePolicyManager dpm = (DevicePolicyManager)c.getSystemService(Context.DEVICE_POLICY_SERVICE);
        if(dpm.isAdminActive(new ComponentName(c.getApplicationContext(),DeviceAdmin.class)))
            dpm.lockNow();
    }
    

    DeviceAdmin.java

    import android.app.admin.DeviceAdminReceiver;
    public class DeviceAdmin extends DeviceAdminReceiver {
    }
    

    在清单

    <receiver
            android:name=".admin.DeviceAdmin"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/admin" />
    
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
    

    并要求设备管理员权限

    private void askAdminPerm(){
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
                new ComponentName(root.getContext(), DeviceAdmin.class));
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.lock_msg_big));
        startActivity(intent);
    }