一些着名的Nexus系列
Android设备有一个磁性传感器,而不是android.hardware.Sensor.TYPE_MAGNETIC_FIELD专门用于使用内置小磁铁的手机壳自动打开/关闭屏幕.
在我的应用程序中,我正在使用android.hardware.Sensor.TYPE_MAGNETIC_FIELD和SensorManager进行磁体检测,以检测用户是否在内部有磁铁的情况下触摸手机.
代码工作没有问题,问题是在这些设备上非常容易意外触发屏幕ON / OFF传感器,关闭屏幕.
我试过了:
> android上的android:keepScreenOn =“true”
>使用权限android.permission.WAKE_LOCK并通过PowerManager获取唤醒锁定.
两者都没有成功.
我的活动恢复时有没有办法暂时禁用这个传感器?
解决方法@H_403_17@
由于霍尔效应传感器的动作与按下电源按钮相同,因此清单中的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);
这将使您的窗口从锁定屏幕消失并使应用程序正常运行.
希望这可以帮助.
在这里,我提供了一个我已经测试过的解决方法.在这种方法中,无论霍尔效应传感器锁定设备和转动显示器,都可以显示您的活动.
在开始解锁操作之前
- 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);
这将使您的窗口从锁定屏幕消失并使应用程序正常运行.
希望这可以帮助.