`
iaiai
  • 浏览: 2197002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

手機監聽弹出浮动窗体

 
阅读更多
手機監聽弹出浮动窗体
描述就不多说了...直接上代码了
package com.iaiai.activity;

import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 
 * <br/>
 * Title: TelListener.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-16 上午10:44:27<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class TelListener extends PhoneStateListener {

	private Context context;
	private WindowManager wm;
	private LinearLayout layout;
	private TextView tv;

	public TelListener(Context context) {
		this.context = context;
	}

	@Override
	public void onCallStateChanged(int state, String incomingNumber) {
		// TODO Auto-generated method stub
		super.onCallStateChanged(state, incomingNumber);
		if (state == TelephonyManager.CALL_STATE_RINGING) {

			wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
			WindowManager.LayoutParams params = new WindowManager.LayoutParams();
			params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
			params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
					| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

			params.width = WindowManager.LayoutParams.WRAP_CONTENT;
			params.height = WindowManager.LayoutParams.WRAP_CONTENT;
			params.format = PixelFormat.RGBA_8888;
			params.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角
			
			layout = new LinearLayout(context);
			layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
			layout.setBackgroundColor(Color.WHITE);
			
			tv = new TextView(context);
			layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
			tv.setText("这是悬浮窗口,来电号码:" + incomingNumber);
			layout.addView(tv);
			
			wm.addView(layout, params);

		} else if (state == TelephonyManager.CALL_STATE_IDLE) {
			if (wm != null) {
				wm.removeView(layout);
			}
		}
	}

}


package com.iaiai.activity;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

/**
 * 
 * <br/>
 * Title: PhoneService.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-16 上午10:49:06<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class PhoneService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		
		Log.i("**************","启动服务");

		TelephonyManager telM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		telM.listen(new TelListener(this), PhoneStateListener.LISTEN_CALL_STATE);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		return super.onUnbind(intent);
	}

}


package com.iaiai.activity;

import android.app.AlertDialog;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.WindowManager;

/**
 * 
 * <br/>
 * Title: PhoneStatReceiver.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-16 上午10:15:24<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class PhoneStatReceiver extends BroadcastReceiver {

	private static final String TAG = "**********";

	private static boolean incomingFlag = false;

	private static String incoming_number = null;

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent interfaceService = new Intent(context, PhoneService.class);
		context.startService(interfaceService);
		
//		// 如果是拨打电话
//		if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//			incomingFlag = false;
//			String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
//			Log.i(TAG, "call OUT:" + phoneNumber);
//			AlertDialog alertDialog = new AlertDialog.Builder(context).setPositiveButton("确定", null)
//					.setTitle(R.string.app_name).setMessage("打出:" + phoneNumber).create();
//			alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); // 窗口可以获得焦点,响应操作
//			alertDialog.show();
//		} else {
//			// 如果是来电
//			TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
//
//			switch (tm.getCallState()) {
//			case TelephonyManager.CALL_STATE_RINGING:
//				incomingFlag = true;// 标识当前是来电
//				incoming_number = intent.getStringExtra("incoming_number");
//				Log.i(TAG, "RINGING :" + incoming_number);
//				AlertDialog alertDialog = new AlertDialog.Builder(context).setPositiveButton("确定", null)
//						.setTitle(R.string.app_name).setMessage("来电:" + incoming_number).create();
//				alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); // 窗口可以获得焦点,响应操作
//				alertDialog.show();
//				break;
//			case TelephonyManager.CALL_STATE_OFFHOOK:
//				if (incomingFlag) {
//					Log.i(TAG, "incoming ACCEPT :" + incoming_number);
//					AlertDialog alertDialog1 = new AlertDialog.Builder(context).setPositiveButton("确定", null)
//							.setTitle(R.string.app_name).setMessage("接通:" + incoming_number).create();
//					alertDialog1.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); // 窗口可以获得焦点,响应操作
//					alertDialog1.show();
//				}
//				break;
//
//			case TelephonyManager.CALL_STATE_IDLE:
//				if (incomingFlag) {
//					Log.i(TAG, "incoming IDLE");
//					AlertDialog alertDialog2 = new AlertDialog.Builder(context).setPositiveButton("确定", null)
//							.setTitle(R.string.app_name).setMessage("挂断").create();
//					alertDialog2.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); // 窗口可以获得焦点,响应操作
//					alertDialog2.show();
//				}
//				break;
//			}
//		}
	}

}


package com.iaiai.activity;

import java.util.List;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Intent;
import android.os.Bundle;

/**
 * 
 * 
 * <br/>
 * Title: PhoneListenerActivity.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-16 上午11:23:34<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class PhoneListenerActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		service();
	}

	private void service() {
		if (!serviceIsStart(
				((ActivityManager) getSystemService(ACTIVITY_SERVICE)).getRunningServices(Integer.MAX_VALUE),
				"com.iaiai.activity.PhoneService")) {
			Intent intent = new Intent(this, PhoneService.class);
			startService(intent);
		}
	}

	// 通过Service的类名来判断是否启动某个服务
	private boolean serviceIsStart(List<ActivityManager.RunningServiceInfo> mServiceList, String className) {
		for (int i = 0; i < mServiceList.size(); i++) {
			if (className.equals(mServiceList.get(i).service.getClassName())) {
				return true;
			}
		}
		return false;
	}
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iaiai.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <!-- 访问网络 -->
	<uses-permission android:name="android.permission.INTERNET" />
	<!-- 验证网络状态 -->
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
	<!-- 写入外部存储 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<!-- 读取电话状态访问电话状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 获取WiFi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
	<uses-permission android:name="android.permission.READ_LOGS" />
	<uses-permission android:name="android.permission.VIBRATE" />
	<uses-permission android:name="android.permission.CALL_PHONE" />
	<!-- 系统对话框 -->
	<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".PhoneListenerActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".PhoneStatReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter >
                <!-- <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
				<category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
        <service android:name=".PhoneService" android:enabled="true" android:process=":remote" />
    </application>

</manifest>
分享到:
评论

相关推荐

    悬浮DIV弹出窗体实现登录

    在网页设计中,"悬浮DIV弹出窗体实现登录"是一种常见的交互设计手法,它能够为用户提供更加便捷和美观的登录体验。这种设计通常将登录表单以浮动窗口的形式展示,用户无需离开当前页面就可以完成登录操作,提升了...

    浮动窗体

    在网页开发中,浮动窗体经常被用于创建弹出式通知、侧边栏、聊天窗口等。例如,当你在浏览网页时,可能会遇到一个始终停留在屏幕边缘的小窗口,这就是浮动窗体的应用。它们可以提供即时反馈,展示重要信息,或者提供...

    jQuery超酷弹出窗体特效,jQuery特效

    首先,jQuery的弹出窗体特效通常涉及到创建一个可浮动的对话框或模态窗口,这些窗口可以用于显示信息、确认用户操作或提供额外的交互界面。这种效果可以通过使用`.show()`, `.hide()`, `.fadeIn()`, `.fadeOut()`等...

    弹出框的浮动层

    在C#编程中,弹出框(通常...总的来说,实现一个浮动层的弹出框涉及C#的窗体设计、事件处理、窗体属性设置以及可能的自定义控件和设计模式应用。通过熟练掌握这些知识点,开发者可以创建出灵活、交互性强的用户界面。

    delphi 模拟QQ弹出窗体

    在IT行业中,模拟QQ弹出窗口是一项常见的编程挑战,它涉及到用户界面(UI)的设计与实现,以及消息通知系统的构建。Delphi是一款强大的Windows应用程序开发工具,它使用Object Pascal语言,提供了一套完整的图形用户...

    swift-KUIPopOver实用好看的iOS浮动窗体

    KUIPopOver的设计目标是使得在iOS应用中添加具有弹出效果的界面元素变得更加容易和快捷。 首先,KUIPopOver的核心功能在于其灵活性和可定制性。通过这个库,开发者可以轻松地调整popover的外观,包括边框宽度、颜色...

    android从底部弹出qq样式窗体

    在Android开发中,创建一个从底部弹出的QQ样式窗体是一种常见的交互设计,它可以用于展示菜单、选项或者对话框。这种效果通过巧妙地利用`WindowManager`服务和自定义布局来实现。以下是对这个主题的详细解释: 1. *...

    winform实现窗体的浮动及隐藏完整源码

    `ShowDialog()`则会弹出模态对话框,阻止用户与父窗体或其他窗体的交互,直到关闭该窗体。 4. 源码分析: 完整源码中可能会包含以下关键部分: - 使用鼠标事件(如`MouseDown`、`MouseMove`和`MouseUp`)来实现...

    窗体的浮动及隐藏.rar

    2. **计时器控制**:可以使用`Timer`控件来定时隐藏或显示窗体,实现如弹出提示或定时提醒的功能。 3. **窗口状态保存**:在隐藏窗体之前,可能需要保存窗体的位置和大小,以便再次显示时恢复到原来的状态。 4. **...

    实用好看的浮动窗体.zip

    在iOS应用开发中,我们常常需要实现一些美观且功能丰富的弹出视图,如Popover。"实用好看的浮动窗体.zip"提供的就是一个名为KUIPopOver的开源项目,它旨在为开发者提供一个简单易用且具有良好视觉效果的Popover组件...

    小 窗体在桌面上浮动的控制

    在编程领域,特别是GUI(图形用户界面)设计中,"小窗体在桌面上浮动的控制"是一个常见的需求,尤其适用于工具提示、弹出通知或者监控应用等场景。本示例实现了一个窗体,该窗体可以在用户的桌面上自由移动,并在...

    可拖动的JS浮动窗口类(调用方便)

    在JavaScript编程中,浮动窗口(通常称为弹出窗口或对话框)是一种常见的用户界面元素,用于显示额外的信息或提供交互功能。"可拖动的JS浮动窗口类"是指一种允许用户通过鼠标拖动来改变窗口位置的JavaScript实现。...

    在siverlight中基于Popup浮动窗体控件模拟ToolTip的实现源码例子

    Popup控件是Silverlight中的一个非常有用的组件,它可以用来创建弹出式窗口,这些窗口可以在用户交互时动态显示或隐藏,非常适合用作提示信息的展示。 首先,让我们了解Popup控件的基本特性。Popup控件是不占据任何...

    js弹出层可拖动兼容各大浏览器

    弹出层通常是指在网页上动态显示或隐藏的元素,它可以是对话框、提示框或者信息窗体。这些元素可以用来显示额外的信息,提供用户交互,或者请求用户的输入。 实现弹出层的可拖动功能,我们需要监听鼠标事件,如`...

    javascript 通过封装div方式弹出div窗体

    首先,通过构造函数创建了名为DivWindow的JavaScript对象,这是整个弹出div窗体功能的核心。构造函数接收了五个参数:最外层div的ID、可拖动div的ID、退出按钮的ID、触发服务器端退出按钮的ID、窗口的宽度、窗口的...

    android 浮动窗口 小窗口

    在Android平台上,浮动窗口(通常称为悬浮窗或小窗口)是一种可以独立于应用程序主界面,在屏幕上方自由移动和缩放的UI元素。这种技术在许多应用中被广泛使用,例如浮动便签、屏幕录制工具或者多任务管理器。在本篇...

    javascript窗体类似div窗体iframe+div窗体

    2. **模拟弹出窗口**:利用div,我们可以创建可拖动、可关闭的浮动窗体,通过JavaScript监听用户的鼠标事件来实现这些功能。 3. **内容隔离**:IFrame可以提供一种内容隔离机制,使得一个页面的不同部分不会互相...

    jQuery 弹出窗口 模式窗口 模式层

    jqmodal是一款轻量级的jQuery模态对话框插件,它创建了一个浮动在网页内容之上的透明层,用于显示弹出内容。jqmodal允许开发者自定义弹出框的样式,同时支持设置弹出框的位置、大小和透明度。此外,它还提供了关闭...

    winform 不获取焦点的浮动窗

    在提供的文件名称“SimplePopup”中,"Popup"通常指的是弹出式窗口,可能是这个浮动窗组件的类名。这个类可能包含了实现上述功能的代码,如显示、定位、关闭以及焦点管理等逻辑。 总的来说,这个项目提供了一个在...

    openlayers3要素移动交互并弹出要素信息

    综上所述,"openlayers3要素移动交互并弹出要素信息"涉及的关键技术包括OpenLayers的初始化、图层管理、样式设计、事件监听、信息弹出以及DOM操作。通过以上步骤,我们可以创建一个互动性强、用户体验良好的地图应用...

Global site tag (gtag.js) - Google Analytics