在Android

时间:2017-04-04 12:03:57

标签: android android-wake-lock

一些着名的Android设备Nexus系列的磁传感器不是android.hardware.Sensor.TYPE_MAGNETIC_FIELD专用于使用内置小磁铁的手机壳自动打开/关闭屏幕。

在我的应用程序中,我使用android.hardware.Sensor.TYPE_MAGNETIC_FIELD使用磁铁检测,SensorManager检测用户是否触摸了内置磁铁的手机。

代码没有问题,问题是在这些设备上非常容易意外触发屏幕ON / OFF传感器,关闭屏幕。

我试过了:

  • android:keepScreenOn="true"关于XML
  • 使用权限android.permission.WAKE_LOCK并通过PowerManager获取唤醒锁。

两者都没有成功。

有没有办法在我的活动恢复时暂时禁用此传感器?

2 个答案:

答案 0 :(得分:3)

清单中的keepScreenOn = true在这里也不起作用,因为霍尔效应传感器的作用与按下电源按钮相同。

在这里,我提供了经过测试的解决方法。通过这种方法,您可以显示自己的活动,而无需考虑霍尔效应传感器锁定设备和旋转显示屏的情况。

开始解锁操作之前

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

上述代码的信用-https://stackoverflow.com/a/45951927/9640177

还要确保添加权限

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

设置这些标志将确保您的窗口在锁屏上方可见。

现在,听听ACTION_SCREEN_OFF的意图。为此,添加一个广播接收器,侦听系统广播的此意图。您需要在本地注册接收器。 (stackoverflow.com/a/9478013/9640177) 在清单中

    <receiver android:name=".receiver">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_OFF"/>
        </intent-filter>
    </receiver>

接收器类

public class receiver extends BroadcastReceiver {
  MyActivity activity;
  receiver(MyActivity activity){
    this.activity = activity;
  }
  @Override
  public void onReceive(final Context context, Intent intent) {
    activity.turnOnScreen();
  }
}

内部活动

 // register receiver
 ...
 IntentFilter screenStateFilter = new IntentFilter();
    screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
    receiver r = new receiver(MyActivity.this);
    registerReceiver(r, screenStateFilter);
 ...
// function to turn on display
public void turnOnScreen(){
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my:Tag");
    wakeLock.acquire();
    wakeLock.release();
}

信用-https://stackoverflow.com/a/44706632/9640177 这将打开显示器。

别忘了在活动完成后不需要删除这些标志,并且不需要排在最前。

getWindow().removeFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

这将使您的窗口从锁定屏幕上消失,并使应用程序正常运行。

希望这会有所帮助。

答案 1 :(得分:0)

该问题最实用的解决方案可能是...

通过物理方式而不是通过软件禁用智能封面功能。

例如拿一把剃须刀和镊子,然后取下磁铁。

...或者干脆拿起另一个没有磁铁的盖子。

或者,file a bugdrivers/input/lid.c