android实现系统电话通话过程中自动感应黑屏
package com.developmenttools.customui.activity;
import java.util.HashSet;
import java.util.Set;
import com.developmenttools.listener.HomeClickListener;
import com.yzx.tools.CustomLog;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
/**
* 基类Activity
*
* @data:2012-12-6 下午4:44:23
*/
public class BaseCallActivity extends BaseActivity {
private HomeKeyEventBroadCastReceiver homeKeyEventReceiver;
private HomeClickListener homeCliekListener;
private Set<Activity> sProximityDependentActivities = new HashSet<Activity>();
private View activityView;
public synchronized void startProximitySensorForActivity(Activity activity) {
if (!sProximityDependentActivities.contains(activity)) {
activityView = ((ViewGroup) activity.getWindow().getDecorView().findViewById(android.R.id.content)).getChildAt(0);
SensorManager sm = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
Sensor s = sm.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if (s != null) {
sm.registerListener(sProximitySensorListener, s, SensorManager.SENSOR_DELAY_UI);
}
sProximityDependentActivities.add(activity);
}
}
public synchronized void stopProximitySensorForActivity(Activity activity) {
simulateProximitySensorNearby(activity, false);
sProximityDependentActivities.remove(activity);
SensorManager sm = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
sm.unregisterListener(sProximitySensorListener);
}
private SensorEventListener sProximitySensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (event.timestamp == 0){
return;
}
proximityNearbyChanged(isProximitySensorNearby(event));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
public Boolean isProximitySensorNearby(final SensorEvent event) {
float threshold = 4.001f; // <= 4 cm is near
final float distanceInCm = event.values[0];
final float maxDistance = event.sensor.getMaximumRange();
boolean isNear = false;
if (maxDistance >= 1023.0f) {
if (distanceInCm < threshold) {
isNear = true;
}
} else {
if (maxDistance >= 255.0f) {
if (distanceInCm <= 0.0f) {
isNear = true;
}
} else {
if (maxDistance <= threshold) {
threshold = maxDistance;
}
if (distanceInCm < threshold) {
isNear = true;
}
}
}
return isNear;
}
private void proximityNearbyChanged(boolean mLastProximitySensorValueNearby) {
for (Activity activity : sProximityDependentActivities) {
simulateProximitySensorNearby(activity, mLastProximitySensorValueNearby);
}
}
private void simulateProximitySensorNearby(Activity activity, boolean nearby) {
Window window = activity.getWindow();
WindowManager.LayoutParams params = activity.getWindow().getAttributes();
if (nearby) {
params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
window.setAttributes(params);
View view = new View(activity);
view.setBackgroundColor(Color.parseColor("#000000"));
window.setContentView(view);
} else {
params.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.setAttributes(params);
if(activityView != null){
window.setContentView(activityView);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
IntentFilter ift = new IntentFilter();
ift.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
homeKeyEventReceiver = new HomeKeyEventBroadCastReceiver();
registerReceiver(homeKeyEventReceiver, ift);
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
startProximitySensorForActivity(this);
}
public void addHomeClickListener(HomeClickListener homeListener){
homeCliekListener = homeListener;
}
public class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {
static final String SYSTEM_REASON = "reason";
static final String SYSTEM_HOME_KEY = "homekey";// home key
static final String SYSTEM_RECENT_APPS = "recentapps";// long home key
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);
if (reason != null) {
if (reason.equals(SYSTEM_HOME_KEY) || reason.equals(SYSTEM_RECENT_APPS)) {
if(homeCliekListener != null){
homeCliekListener.onClick();
}
}
}
}
}
};
@Override
protected void onPause() {
super.onPause();
stopProximitySensorForActivity(this);
}
@Override
protected void onRestart() {
super.onRestart();
startProximitySensorForActivity(this);
}
@Override
protected void onDestroy() {
stopProximitySensorForActivity(this);
unregisterReceiver(homeKeyEventReceiver);
super.onDestroy();
}
}
android实现系统电话通话过程中自动感应黑屏的更多相关文章
- Asterisk 通话过程中执行动作(即applicationmap )的使用方法和电话转会议的实现
asterisk在正常通话过程中执行拨号计划中动作是通过feature.conf中的[applicationmap ]下定义的,举例如下: nway-start => *0,callee,M ...
- Linux系统在启动过程中mbr主引导程序被破坏的解决方案
首先,mbr主引导程序被破坏是指系统在启动过程中,磁头找不到/boot分区(windows的启动分区在c盘). 1)下面我们模拟主引导分区被破坏的情况:(在启动分区划分446M的存储大小) 2)重启( ...
- Android 儿子Activity在启动过程中的流程组件 && 儿子Activity在一个新的进程组件启动过程
1.儿子Activity在启动过程中的流程组件 在Android Activity启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文 ...
- Android自动问题——黑屏、死机等解决方法
今天用了下Android Studio,出现了一些问题,现在将启动过程中遇到的问题和解决方案列出来,方便大家参考. 安装过程不多说,网上一搜一大把. 那直接说问题吧: 1. 无法启动,报错:Faile ...
- win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动
问题:win7重装系统中强制重启导致硬盘无法识别,开机后无法选择使用u盘启动盘启动,电脑黑屏,将硬盘拆掉可以使用u盘启动,使用SATA转接口在win7中有反应但无法识别 无法识别原因:重装系统过程中断 ...
- Ubuntu18---VMware虚拟机中Ubuntu18.04系统,开机输入密码后无响应黑屏
系统崩坏了,重装过几次,这次决定不充装了. 搜索大神解决方案后,了解到是图形界面程序损坏,可能是在更新内核或者安装软件的时候,把与xorg相关的文件给清除了. 解决方案如下: 1.登录系统进入,黑屏后 ...
- 关于Android Studio开发环境变量的设置(avd启动黑屏)
之前因为乱按网上的设置导致启动avd启动黑屏,查了很久原来是ANDROID_AVD_HOME变量没有加$符号 以下是正确的环境变量配置 添加环境变量(注意avd中有一个$符号) ANDROID_SDK ...
- 在Android中自动实现横竖屏切换的问题
http://developer.android.com/training/basics/supporting-devices/screens.html参照Google推荐的做法 在你项目的res 文 ...
- Linux系统在启动过程中grub引导文件丢失的解决方法
在/boot/grub2目录下有一个grub.cfg文件:该文件主要是用来自动地引导系统启动内核程序和系统的初始化程序. 问题一:当系统在启动的情况下,我们不小心删除/boot/grub2/grub. ...
随机推荐
- JavaScript push()和splice()方法
JavaScript push() 方法 定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法 arrayObject.push(newelement1,newele ...
- 20151124002 treeView 数型菜单的操作
20151124002 treeView 数型菜单的操作 protected void FillTree() { SqlConnection1 = new Syst ...
- exp函数
第一种是tensor用exp函数 th> a [torch.DoubleTensor of size 1x3] [.0002s] th> a:exp() 2.7183 2.7183 1.0 ...
- 切分vocab时遇到的问题
vocab的格式如下所示,每个词和对应100维的向量: </s> 0.004003 0.004419 -0.003830 -0.003278 0.001367 0.003021 0.000 ...
- Data
[pdf你真可爱] [题目分析] 上午考试想到用二分答案做,写残了... 设两个数列,a和b,a表示磁头,看作指针,b就是要扫描的那个序列. 假设一个答案mid,就是a中的数字走mid步能否到达b中的 ...
- IOS自定义仪表盘
登录|注册 周海锋 的专栏 Objective-C/Cocos2d/Cocos2d-x/Php/JS 目录视图 摘要视图 订阅 2016软考项目经理实战班 学院周年礼-顶 ...
- MSM8909平台 LED背光的控制
之前齐师兄问我,是不是应该有一个文件记录背光灯的亮度,我说理论上有,但是在哪里我真的还没有见过.只知道在调LCD驱动的时候会调用一个背光控制的函数,传进来一个亮度值就可以配置亮度了,至于这个函数是谁调 ...
- 【leetcode❤python】Find the Difference
#-*- coding: UTF-8 -*- class Solution(object): def findTheDifference(self, s, t): ...
- Cheatsheet: 2013 07.01 ~ 07.08
.NET The overhead of async/await in NET 4.5 await Task, Task.Wait and Friends 350 Interview Question ...
- 【转】ffmpeg参数中文详细解释
感谢“大神”的无私奉献:http://blog.csdn.net/leixiaohua1020/article/details/15811977 a) 通用选项 -L license-h 帮助-fro ...