android项目 之 来电管家(5) ----- 添加监听服务

android调用ITelephony类,AIDL实现电话,联系人黑名单拦截挂断服务 版权声明:本文为博主原创文章,未经博主允许不得转载。 首先新建AIDL文件,ITelephony.aidl。注意包名为com.android.internal.telephony,不可更改,此时需要重新rebuild project才能正常使用。 总体效果图:如下 废话不多说,咱还是直接上代码吧: 首先布局文件:activity_phonestate<?xml version="1.0 阅读详情

       上面四节,已经实现了界面设计,黑名单(白名单的添加与删除与黑名单同理,不再赘述),启用监听开关,定时拦截开关,及拦截模式选择等功能,下面就要实现来电管家最核心的功能,也就是拦截功能。

        主要思路:

                1.  制定拦截模式,这里主要有两个,一个是黑名单模式,也就是只拦截在黑名单中的号码;另一个就是白名单模式,拦截除了白名单以外的号码。

                2.  根据用户自定义设置信息,制定正则表达式,判断拦截的标准。

                3.  使用对应的类实现挂断电话的功能。

       

       监听模块主要是利用service实现功能,为了实现电话挂断功能,这里需要调用远程的AIDL Service,大多数书上都介绍要将Android源代码中如下两个文件复制到项目的相应位置:

             com.android.internal.telephony包下的ITelephony.aidl

             android.telephony包下的NeighboringCellinfo.aidl

       但是下载源码需要翻墙,有点麻烦,其实做这些的目的就是为了在根目录下自动生成ITelephony.java源文件,因此没有源码也可以,具体做法如下:

            1)在项目的src目录下,新建package:com.android.internal.telephony

            2)   在刚新建的package下,新建一个名为ITelephony.aidl的文件。

            3)   将以下代码拷到刚新建的文件中。

  package com.android.internal.telephony;  
        interface ITelephony{  
            boolean endCall();  
            void answerRingingCall();  
        }  

           这样,ADT会在根目录下自动生成ITelephony.java源文件了。

          service的整个代码如下,里面也有解释:

          ListenService.java

package com.example.callmanager;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.media.AudioManager;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.ContactsContract.PhoneLookup;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

import com.android.internal.telephony.ITelephony;

public class ListenService extends Service {
	TelephonyManager tManager;
	private SQLiteDatabase db;
	private SharedPreferences spf;
	private CustomPhoneCallListener callListener;
	
	

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		
	    System.out.println("create");
	}
	
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		tManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
		
	    callListener = new CustomPhoneCallListener();
		spf = this.getSharedPreferences("setting", Activity.MODE_PRIVATE);
		tManager.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
		System.out.println("start");
		return super.onStartCommand(intent, flags, startId);
	}

	
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		callListener = null;
		tManager = null;
		System.out.println("destory");
		stopSelf();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		return super.onUnbind(intent);
		
	}
	
	//创建或打开数据库
    public void create_db(){
    	//创建或打开数据库
    	db = SQLiteDatabase.openOrCreateDatabase(ListenService.this.getFilesDir().toString()+"/list.db3", null);

    	if(db == null){
    		Toast.makeText(ListenService.this,"数据库创建不成功",Toast.LENGTH_LONG).show();
    	}
    	else{
    		
    		/*//创建另一个表,用于存放来电信息
    		db.execSQL("create table if not exists callInfo(_id integer primary key autoincrement," +
    				"name varchar(50)," +
    				"number varchar(15),"+
    				"callTimes varchar(20));");*/
    	
    	}	
    }
	
   //插入 
    public void insert_callInfo(String name,String number,String time){
    	Cursor cursor = db.rawQuery("select * from callInfo where callTimes = '"+time+"';",null);
    	if(cursor.getCount() == 0){
    		db.execSQL("insert into callInfo(name,number,callTimes) values('"+ name+ "','" + number +"','" + time + "');");
    	}
    	cursor.close();
    	
    }
	
	 public class CustomPhoneCallListener extends PhoneStateListener{
	    	@Override
	    	public void onCallStateChanged(int state, String incomingNumber) {
	    		super.onCallStateChanged(state, incomingNumber);
	    		
	    			if(spf.getBoolean("isStartListen", false)){
		    			//判断该电话是否在黑名单中
	    				create_db();
	    				boolean callEnd_flag = false;
	    				String incomingName = null;
	    				SimpleDateFormat   formatter   =   new   SimpleDateFormat   ("MM-dd HH:mm");  
				        Date   curDate   =   new   Date(System.currentTimeMillis());//获取当前时间 
				        String   strTime   =   formatter.format(curDate);
	    				//如果启用白名单模式
	    				if(spf.getBoolean("isWhiteList",false)){
	    					System.out.println("whiteList");
	    					callEnd_flag = !isInWhiteList(incomingNumber);
	    					
	    					//根据号码找到联系人姓名
	    					incomingName = getContactsNameByNumber(incomingNumber);
	    					
	    				}
	    				//如果是黑名单模式
	    				else{
	    					incomingName = isInBalckList(incomingNumber);
	    					if(incomingName == null)
	    						callEnd_flag = false;
	    					else
	    						callEnd_flag = true;
	    				}
	    				
	    				//如果启用时间段,则判断当前拨打电话时间是否在设定时间段中
	    				if(spf.getBoolean("isTime", false)){
	    					System.out.println("inTime");
	    					callEnd_flag = callEnd_flag && isInterceptTime(strTime);
	    				}
		    			
		    			
		    			switch(state){
		    			case TelephonyManager.CALL_STATE_IDLE:
		    				break;
		    			case TelephonyManager.CALL_STATE_OFFHOOK :
		    				break;
		    			//当电话呼入时
		    			case TelephonyManager.CALL_STATE_RINGING :
		    				toggleRingerMute(getApplicationContext());
		    				
		    				if(callEnd_flag){
		    					
		    			        
		    					try {
									Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
									//获取远程telephony_service的IBindler对象的代理
									IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});
									//将IBinder对象的代理转换为ITelephony对象 
									ITelephony telephony = ITelephony.Stub.asInterface(binder);
									//挂断电话 
									telephony.endCall();
		    					} catch (NoSuchMethodException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (ClassNotFoundException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (IllegalAccessException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (IllegalArgumentException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (InvocationTargetException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (RemoteException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
		    					
		    					//将该号码插入来电信息数据库中
		    					//获得当前的时间 
		    					if(incomingName == null){
		    						incomingName = "陌生号码";
		    					}
		    			        insert_callInfo(incomingName, incomingNumber, strTime);
		    			        
		    				}
		    				System.out.println("bindListen");
		    				
		    				break;
		    			}
		    		}
	    		
	    		db.close();
	    	}
	    }
          //通过电话号码查找联系人的姓名,如果查找到,则返回联系人的姓名,否则,返回null	 
	 public String getContactsNameByNumber(String number){
		 Cursor c = getContentResolver().query(Uri.withAppendedPath(
	             PhoneLookup.CONTENT_FILTER_URI, number), new String[] {
	             PhoneLookup._ID,
	             PhoneLookup.NUMBER,
	             PhoneLookup.DISPLAY_NAME,
	             PhoneLookup.TYPE, PhoneLookup.LABEL }, null, null,   null );


		 if(c.getCount() == 0){
			 return null;
		 } 
		 else {
	         c.moveToFirst();
	         return c.getString(2); //获取姓名
	         
	     }
		 
	 }
	 
	 private static int previousMuteMode = -1;

	 /**
	  * 来电静音
	  * 
	  * @param context
	  */
	 private void toggleRingerMute(Context context)
	 {
	     AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
	     if (previousMuteMode == -1)
	     {
	         previousMuteMode = am.getRingerMode();
	         am.setRingerMode(0);
	     }
	     am.setRingerMode(previousMuteMode);
	     previousMuteMode = -1;
	 }

 
	 

	 
	 
	 
	 
	 //判断当前拨打时间 是否在拦截时间段里
	 public boolean isInterceptTime(String time){
		 //如果启用时间段 
		 if(spf.getBoolean("isTime", false)){
			 String startTime = spf.getString("startTime", "");
			 String endTime = spf.getString("endTime", "");
			//比较当前时间是否在拦截时间段内
			if(time.compareTo(startTime) >= 0 && time.compareTo(endTime) <= 0){
				 return true;
		    }
		 }
		 return false;
	 }

	 
	 
	 
	 //判断给定号码是否在白名单中 
	 public boolean isInWhiteList(String phone){
		 Cursor cursor = db.rawQuery("select * from whiteList where number='"+phone+"';", null);
		 cursor.moveToFirst();
		 //如果该号码在白名单中,则返回true
		 if(cursor.getCount() > 0){
			 cursor.close();
			 return true;
		 }
		 return false;
	 }
	 
	 

	//判断给定号码是否在黑名单中 
	public String isInBalckList(String phone){
	    	Cursor cursor = db.rawQuery("select * from blackList where number='"+phone+"';", null);
	    	String name = null;
	    	cursor.moveToFirst();
	    	if(cursor.getCount()>0)
	    		name = cursor.getString(cursor.getColumnIndex("name"));
	    	cursor.close();
	    	return name;
	}


		@Override
		public IBinder onBind(Intent intent) {
			// TODO Auto-generated method stub
			return null;
		}
	
	
	

}

             代码很长,但核心的就是CustomPhoneCallListener这一部分,里面的主要思路就是通过读取用户的设置信息,判断是否拦截。

             这里同时也实现了,将拦截信息写入数据库,所以也就有了上述代码中的数据库的相关代码了。

             最后,重要的一点,就是,和Activity一样,service同样也需要进行注册,在AndroidManifest.xml里添加:

 		<service android:name="com.example.callmanager.ListenService"  
   				android:enabled="true" >  
   			<intent-filter>  
       				<action android:name="com.example.callmanager.ListenService" />  
   			 </intent-filter>  
		</service> 

          当然,因为要监听来电状态,少不了读取通话记录和读取电话状态的权限,在AndroidManifest.xml里添加:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>


         这样,在该需要启用该监听服务时,就可以通过Intent来启动该服务,当启用该服务后,即使退出了Activity,也可以实现监听,因为service依然在后台运行,这就是service最基本的功能。

       

 

 

 

Android拦截电话与短信(电话拒接/短信拒收) 前段时间领导说了这样一个需求:对特定的号码电话进行拦截、短信拒收,在百度了查阅了很多的资料,结果有点不尽人意。特别是AIDL通信接口废了老大劲。直接上过程 创建aidl通信接口直接在main目录新建aldl类型文件ITelephony即可,自动生成包名等等如图所示此处有坑:网上基本上都是让这样写 interface ITelephony { boolean endCall(...... 阅读详情

相关推荐

Unity安卓TTS集成实战:解决RT-Voice打包后无声问题

TTS(文本转语音)技术是实现人机语音交互的核心组件,其原理是将文本信息通过语音合成引擎转换为可播放的音频流。在移动应用开发中,稳定的TTS服务对于提升用户体验至关重要,尤其适用于导航、教育、AR等需要实时语音反馈的场景。Unity作为跨平台游戏引擎,在安卓端集成TTS时,常因平台差异、权限配置和引擎兼容性问题,导致在编辑器运行正常但打包后无声的典型故障。本文以解决RT-Voice插件在安卓真机无声问题为切入点,深入剖析了Unity音频系统与安卓原生TTS服务的集成原理,并提供了通过集成Google TTS

weixin_34150830的博客 373

android如何处理错误,如何在android中解决此错误“com.android.internal.telephony无法解析为类型”...

我正在创建简单的呼叫过滤应用程序,限制不必要的呼我使用以下代码来限制调用,但我无法在下面的代码中解决此行的问题“com.android.internal.telephony.ITelephony telephonyService =(ITelephony)m.invoke(tm);”它显示错误消息com. android.internal.telephony无法解析为android中的某个类型如何...

weixin_40004659的博客 1777

【工具】利用开源项目实现短信自动化转发至多平台

本文详细介绍了如何利用开源项目SmsForwarder实现短信自动化转发至企业微信、钉钉等多平台。通过实时监控安卓手机短信,结合智能规则引擎和自定义模板,可高效转发验证码等重要信息,提升团队协作效率。文章包含环境准备、配置步骤及安全防护等实用指南。

weixin_30485379的博客 434

Android Telephony

Telephony提供的功能: Voice, SMS, SIM, Data Connection, STK and etc 这个模块特殊的地方: 1. 在Phone应用中,注册了Service。这样Phone就必须始终运行。    将ITelephony放到Phone应用中:在Service中需要提供UI界面,比如打电话,拨号等。  2. 将与硬件相关的模块,抽离出来。一方面方便维护。另一

DOOM 2391

android 16 蓝牙源码分析

本文分析了Android 16系统中蓝牙开启的完整调用链路,从应用层到硬件驱动的详细流程。当应用调用BluetoothAdapter.enable()后,请求依次经过Framework层、Service层、JNI层、HAL层,最终到达蓝牙协议栈和HCI层。关键步骤包括:BluetoothManagerService处理状态转换,AdapterService初始化蓝牙协议栈,通过JNI调用底层接口,HciHalImpl与硬件交互完成上电。整个过程涉及多线程协作、异步回调、状态机管理等机制,最终通过stack_

zjy764219923的专栏 379

Android音频开发全解析:从架构原理到AudioTrack/AudioRecord实战

在移动应用开发中,音频处理是构建多媒体应用的核心技术之一,涉及声音的采集、处理和播放全链路。其基本原理是将模拟声音信号通过采样、量化转换为数字PCM信号,再经由系统音频框架进行路由、混音等处理,最终驱动硬件输出。这项技术的工程价值在于实现低延迟、高保真的音频体验,广泛应用于音乐播放、语音通话、游戏音效和实时通信等场景。Android系统通过分层的音频架构(应用层、框架层、本地层和驱动层)来管理这一复杂流程,其中AudioTrack和AudioRecord是关键API,分别负责PCM数据的播放与采集。理解音频

weixin_30595035的博客 437

[应用代码] android 自动接听电话和挂断 (适合目前所有版本)

转载于:http://www.eoeandroid.com/thread-322243-1-1.html 注意:2.3上实现方式接听使用answerRingingCallWithBroadcast方法 注意:android2.3版本及以上不支持下面的自动接听方法。 (会抛异常:java.lang.SecurityException: Neither user xxxxx nor curren

lyen2010的专栏 3956

android-26-带internal-telephony包.jar

android sdk -26 带 com.android.internal.telephony 包的 jar, 下载后 将名称改为 android.jar 替换 anroid-sdk -> platform -> android-26 文件下的 android.jar 即可直接找到 telephony 下的类, 不会报错

android 4 时间限制,android项目 之 来电管家(4) ----- 添加拦截时间段

在大多数的骚扰拦截类的软件中都会有定时拦截这个实用的的功能,其实,也不难实现。看图:在未选中启用时间段时,下面的两个开始时间和结束时间呈灰色状态,并且单击无响应,启用时间段后,下面则变成了可以单击的状态,通过单击可以弹出选择日期与时间的对话框,用于选择开始时间和结束时间。主要思路:喎�"https://www.2cto.com/kf/ware/vc/" target="_blank" class=...

weixin_33987275的博客 427

android获取ITelephony的方法和代码

android中有很多隐藏接口,即手机中有而SDK中没有开放的接口,这些接口可以通过反射获取并使用。本文主要介绍ITelephony的获取方法,附代码。

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南

本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。

weixin_29219539的博客 270

CAN报文解析:彻底搞懂Motorola与Intel字节序的区别

在CAN总线通信中,报文解析是把十六进制原始数据还原为物理信号的关键环节,而字节序则是决定解析正确性的核心因素之一。CAN总线作为汽车电子最常用的现场总线,其报文数据场中的多字节信号存在两种截然不同的排列方式:Intel格式与Motorola格式。前者遵循LSB在前的小端排列原则,后者则从MSB所在位置出发按高位字节优先扩展。二者在整字节对齐时结果可能相同,但一旦信号跨字节且非对齐,解析结果便会天差地别。理解两种格式的位序原理,学会从DBC文件中的@0/@1标记快速识别类型,是从事嵌入式、车载网络或工业控制

weixin_33827590的博客 269

NX工程图避坑指南:唐康林老师视频里没细说的10个实用技巧与隐藏设置

本文深入解析NX工程图中10个易被忽视的实用技巧与隐藏设置,涵盖视图更新、剖面线自定义、标注样式统一等核心问题。特别针对UG/NX8.5/NX10用户,提供从首选项设置到打印优化的完整解决方案,帮助工程师避开常见陷阱,提升制图效率与规范性。

weixin_28683689的博客 575

[安卓]手机管家(十)正则表达式 & 号码归属地

校验QQ号码 必须5-15位数字 0不能开头 纯代码式 import java.util.Scanner; public class RegExpDemo { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource"

rjlgo的专栏 1584

保姆级教程:在RK3588开发板上用CMake交叉编译ZLMediaKit(附完整toolchain配置)

本文提供了一份详细的RK3588开发板上使用CMake交叉编译ZLMediaKit的教程,包括完整的toolchain配置和实战避坑指南。从环境准备、工具链配置到依赖处理、编译部署,手把手指导开发者完成ARM64架构的流媒体服务搭建,特别适合嵌入式开发新手。

weixin_28681255的博客 383

如何快速获取SAMM、SMIC等主流微表情数据集?完整申请指南(附避坑技巧)

本文提供了获取SAMM、SMIC等主流微表情数据集的完整申请指南,包括申请前的准备工作、分步申请流程、协议谈判技巧以及数据使用与维护策略。特别针对高分辨率动态捕捉和多模态同步数据等热词,帮助研究者高效获取高质量数据集,避免常见陷阱。

weixin_29057163的博客 421

分享一个项目整体流程,对大家面试应该很有帮助

本文同步发表在我的论坛中:http://stay4it.com/forum.php?mod=viewthread&amp;tid=4&amp;extra=page%3D1 所有附件均放在我的论坛中。更多Android资源请关注我的论坛。 这个项目是我一年多前设计的方案,准备自己做来着,后来因为种种原因没做了,现在分享出来,应该对大家面试很有帮助,一个项目的方案,流程图,到实现。整个这样一个环节。...

weixin_34179968的博客 167

IEC104协议学习专栏内容规划

IEC104协议的编程学习

sixtome 1110

利用Android无障碍服务实现微信通话自动接听:李跳跳规则配置实战

Android无障碍服务(Accessibility Service)是系统为辅助残障用户而提供的核心接口,它允许应用读取屏幕内容并模拟用户交互操作。其工作原理是通过监听界面变化事件,实时获取控件层级信息,并与预设规则进行匹配,从而触发自动化动作。这一机制在移动端自动化领域具有重要技术价值,能够显著提升操作效率,尤其适用于需要快速响应或重复性操作的场景。在自动化测试、应用辅助工具及个人效率提升等应用场景中,无障碍服务常被用于实现自动点击、文本输入和流程跳转等功能。本文聚焦于利用李跳跳这一基于无障碍服务的轻量

weixin_30629653的博客 386

EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站

以上就是搭建xenomai系统及自己的IGH主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3159

uniapp [微信小程序] - 实现语音播报功能+实时收款播报,使用同声传译插件做文字转语音播报类似微信/支付宝收款播报小程序语音识别和朗读,手机提醒播放自定义收款语音信息(音频+收款金额+文案)

uniapp-实现语音播报功能,实时收款播报,uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)uniapp小程序使用文字转语音播报类似支付宝收款播报小程序语音识别和朗读)IOS苹果手机播报没有声音,生成语音并播放,微信小程序接入官方wechatSi(微信同声传译)uniapp小程序使用文字转语音播报类似支付宝收款播报,uni-app 小程序端实现文字语音播报,uniAPP文本转语音,uniapp 文字转语音文字播报,手机静音播放没声音,收款方提示音 文字转语音朗读 同声传译,uniapp小程

🏆 前端领域优质创作者 3795

【android】仿360手机卫士的简易设计思路及源码

笔者最近一直忙于满广州的跑,实习好难找好难找,博客也是有点久没去更新。仿360手机卫士的实现的目的更多的是出于对常用知识点的一个巩固吧,比较适合像我这种接触没多久的学习者在学习之余拿来练手保持写代码的感觉的的一个不错的小项目。       涉及的技术:      都是些非常常用的android常用开发,但涉及面比较广吧。(小编这边也谈不出啥新意,就简简单单举几个小例子,见谅见谅~!

zjngogo的博客 1万+

OpenClaw人人养虾:接入即时通讯平台Zalo

通过 Zalo Official Account(OA,官方账号)API,可以将 OpenClaw 接入 Zalo,实现面向越南用户的自动化客服和互动。

王国平的博客 437

Cleer Arc5如何实现跨平台设备的无缝切换

Cleer Arc 5通过蓝牙5.3、LE Audio架构思想与自研DualLink Sync Engine技术,实现跨iOS、Android、Windows设备的毫秒级音频自动切换。其核心在于软硬协同设计,支持双链路并发、上下文感知与智能路由决策,解决多设备连接割裂问题,提供无感切换体验。

weixin_36231030的博客 648

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Androidの应用源码下载地址

Androidの应用源码下载地址 1. android ViewFlipper 手势滑动图片浏览

Steampy专栏 1200

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android app 测试case积累

不同产品线的android app,在测试场景上有相似,或者测试case可以按照控件类型积累。持续积累如下: 典型的公共模块和场景: 1.分享 2.账号登陆 3.消息推送 4.同步:同步数据的增删改查 5.覆盖安装 6.app对后端请求加密 7.兼容其他APP: 输入法类:百度输入法、搜狗输入法、android系统默认输入法; 安全类:百度安全卫士、360安全卫士、QQ手机管家

bailangriver的专栏 1010

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: android项目 之 来电管家(4) ----- 添加拦截时间段
下一篇: android项目 之 来电管家(6) ----- 显示拦截记录
jesson20121020
博客等级 码龄15年 361粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值