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实现系统电话通话过程中自动感应黑屏的更多相关文章

  1. Asterisk 通话过程中执行动作(即applicationmap )的使用方法和电话转会议的实现

      asterisk在正常通话过程中执行拨号计划中动作是通过feature.conf中的[applicationmap ]下定义的,举例如下: nway-start => *0,callee,M ...

  2. Linux系统在启动过程中mbr主引导程序被破坏的解决方案

    首先,mbr主引导程序被破坏是指系统在启动过程中,磁头找不到/boot分区(windows的启动分区在c盘). 1)下面我们模拟主引导分区被破坏的情况:(在启动分区划分446M的存储大小) 2)重启( ...

  3. Android 儿子Activity在启动过程中的流程组件 &amp;&amp; 儿子Activity在一个新的进程组件启动过程

    1.儿子Activity在启动过程中的流程组件 在Android Activity启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文 ...

  4. Android自动问题——黑屏、死机等解决方法

    今天用了下Android Studio,出现了一些问题,现在将启动过程中遇到的问题和解决方案列出来,方便大家参考. 安装过程不多说,网上一搜一大把. 那直接说问题吧: 1. 无法启动,报错:Faile ...

  5. win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动

    问题:win7重装系统中强制重启导致硬盘无法识别,开机后无法选择使用u盘启动盘启动,电脑黑屏,将硬盘拆掉可以使用u盘启动,使用SATA转接口在win7中有反应但无法识别 无法识别原因:重装系统过程中断 ...

  6. Ubuntu18---VMware虚拟机中Ubuntu18.04系统,开机输入密码后无响应黑屏

    系统崩坏了,重装过几次,这次决定不充装了. 搜索大神解决方案后,了解到是图形界面程序损坏,可能是在更新内核或者安装软件的时候,把与xorg相关的文件给清除了. 解决方案如下: 1.登录系统进入,黑屏后 ...

  7. 关于Android Studio开发环境变量的设置(avd启动黑屏)

    之前因为乱按网上的设置导致启动avd启动黑屏,查了很久原来是ANDROID_AVD_HOME变量没有加$符号 以下是正确的环境变量配置 添加环境变量(注意avd中有一个$符号) ANDROID_SDK ...

  8. 在Android中自动实现横竖屏切换的问题

    http://developer.android.com/training/basics/supporting-devices/screens.html参照Google推荐的做法 在你项目的res 文 ...

  9. Linux系统在启动过程中grub引导文件丢失的解决方法

    在/boot/grub2目录下有一个grub.cfg文件:该文件主要是用来自动地引导系统启动内核程序和系统的初始化程序. 问题一:当系统在启动的情况下,我们不小心删除/boot/grub2/grub. ...

随机推荐

  1. 通过HtmlEmail 发送邮件

    今天第一次来上海市虹口图书馆上自习,感觉还是很爽的.自己撸代码学会了发送邮件.啥都不说了,直接撸代码吧! 首先 必须引进来三个jar包: compile 'javax.mail:mail:1.4.7' ...

  2. [Ogre][地形]OgreTerrain分析以及使用

    Ogre 1.7.2中的地形教程 ○读者可以对照着Ogre1.7.2中的terrain.h源码进行阅读加深理解,蓝色部分均为源码 ○去除了一些具体场景比如添加mesh,设置setAmbientLigh ...

  3. Reflector8.5 .net反编译工具 破解教程

    一.断网 二.打开软件.打开注册机 三. 四. 五. 六. 七. 八.

  4. Tautology 分类: POJ 2015-06-28 18:40 10人阅读 评论(0) 收藏

    Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10428   Accepted: 3959 Descri ...

  5. Java学习之路(六)

    1:包及和访问权限 将类放置到一个包当中,需要使用package “包名” 编译时需要使用 -d 参数  该参数的作用是依照包名生成相应的文件夹 一个类的全民应该是  “包名” + “.” + “类名 ...

  6. Convert.ChangeType转换泛型的性能损失测试

    经常要传入参数包,当时一直是用泛型+ChangeType解决的.测试了下,看来这样确实慢了. 另外,可能都会认为Release发布之后会被优化掉.但测试了Release和Debug结果一样慢,比较失望 ...

  7. UVa 1339,紫书P73,词频

    题目链接:https://uva.onlinejudge.org/external/13/1339.pdf 紫书P73 解题报告: #include <stdio.h> #include ...

  8. 【MySQL】MySQL的group_concat使用例子

    > 参考的优秀文章 GROUP_CONCAT(expr) > 简单的例子 此函数的功能,是拼接group分组多行的数据为一行,并可以指定去重.排序.分隔符. 例子: select t.na ...

  9. HDU2112 HDU Today 最短路+字符串哈希

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. 【leetcode❤python】83. Remove Duplicates from Sorted List

    #-*- coding: UTF-8 -*- # Definition for singly-linked list.# class ListNode(object):#     def __init ...