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. ...
随机推荐
- CSUFT 1002 Robot Navigation
1002: Robot Navigation Time Limit: 1 Sec Memory Limit: 128 MB Submit: 4 Solved: 2 Descript ...
- android post请求
参考文章:http://blog.csdn.net/lotusyangjun/article/details/22292445 http://blog.csdn.net/withiter/articl ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- SqlSever基础 dateadd month 增加五个月
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 用于JDBC操作数据库的公共类
/* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...
- Repeater导航菜单DataList产品展示
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JD.aspx.cs&quo ...
- UVA 11584 一 Partitioning by Palindromes
Partitioning by Palindromes Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- C#借助谷歌翻译实现翻译小工具(二)添加托盘图标
接上一节完善小翻译工具 设置Form的ShowInTaskbar属性为False,取消任务栏显示 设置Form的MaximizeBox属性为False,取消最大化显示 窗口添加两个控件 分别是:Con ...
- 如何设计点击点击一个div,其他div做出对应反应,以及获取一个节点下的子节点
<div id="show"> <div>1</div> <div>2</div> <div>3</d ...
- OGNL调用静态方法和属性
ognl的全名是 Object-Graph Navigation Language 表示的是图对象导航语言...我觉得它最厉害的一点是,通过"."来实现对象的导航...下面看他他的 ...