监听Android CTS测试项解决方案(二)

二,监听当前测试项是否是Accelerometer Measurement Test测试项

通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项。但是由于是监听Android系统中所有Activity,因此会大大降低系统的性能,因此这里有一种效率更高的方式来精确定位当前CTS正在测试的测试项,而不会对系统造成很大的影响。(当然不能修改CTS源码,我们需要使用Android提供的原生CTS APK进行验证)

那么我们这里以Accelerometer Measurement Test测试为了来进一步分析代码。

第一步:寻找CTS Verifier工具调用Framework或者底层获取数据的函数

(AccelerometerMeasurementTestActivity.java)onRun()-->verifyMeasurements()-->(VerifyMeasurementsOperation.java)execute()-->doWork()-->(SensorManagerTestVerifier.java)mSensor.collectEvents(100)

        public TestSensorEvent[] collectEvents(int eventCount, String debugInfo) {
        this.registerListener(debugInfo);
        TestSensorEvent[] events = this.getEvents(eventCount, debugInfo);
        this.unregisterListener();

        return events;
    }
        public void registerListener(String debugInfo) {
        boolean result = mSensorManager.registerListener(
                mEventListener,
                mSensorUnderTest,
                mSamplingRateInUs,
                mReportLatencyInUs);
        String message = SensorCtsHelper.formatAssertionMessage(
                "registerListener",
                mSensorUnderTest,
                debugInfo);
        Assert.assertTrue(message, result);
    }

从上面的代码中我们可以发现,在进行测试的时候会注册和取消一个监听器,而通过对这个监听器的追踪发现,监听器是在SensroManager中注册的,而SensorManager是一个抽象类,而在系统中实现SensorManager的类只有SystemSensorManager.java,在该类中也只有 
  protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,

int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags)被重写,因此也就是说所有的CTS 测试都会经过这里,因此如果我们能够在这里得到当前处于活动状态下的应用程序并通过Sensor中的TYPE来判断进行的测试项来精确定位,当前CTS正进行测试的测试项。

具体实现方式:

 private boolean isAcclerometerMeasurementTest(){
		if(mAppContextImpl == null)
		{
			return false;
		}
        final ActivityManager am = (ActivityManager)mAppContextImpl.getSystemService(Context.ACTIVITY_SERVICE);
		if(am == null)
		{
			return false;
		}
        List<RunningAppProcessInfo> list = am.getRunningAppProcesses();

        if ((list!=null) && (list.size() != 0)) {
            RunningAppProcessInfo topRunningProcess = list.get(0);
            if((topRunningProcess !=null) && (topRunningProcess.processName !=null) && topRunningProcess.processName.equals("com.android.cts.verifier")){
				if(isAcclerometerMeasurementFocus() == 1)
				{
                	return true;
				}
            }
        }
        return false;
    }
        if((sensor != null)&&(sensor.getType()==Sensor.TYPE_ACCELEROMETER) && isAcclerometerMeasurementTest()){

        }
时间: 2024-11-16 22:17:00

监听Android CTS测试项解决方案(二)的相关文章

监听Android CTS测试项解决方案(一)

前言: 首先这里需要详细叙述一下标题中"监听Android CTS测试项解决方案"的需求.这里的需求是指我们需要精确的监听到当前CTS测试正在测试的测试项. 因为我们知道CTS认证是获得Google推出的 Android 系统中 Android Market 服务的前提.CTS 兼容性测试的主要目的和意义在于使得用户在 Android 系统的应用过程中,有更好的用户体验,并展现出 Android 系统的优越特性:使得 Android 应用程序编写者更容易编写高质量的应用程序:充分展现

服务器重启后Oracle监听服务没有自动启动的解决方案

最近一直在被这样一个问题烦恼,就是服务器断电重启后,Oracle监听服务没有正常自动启动(监听服务已经设置为自启动). 具体是这样的,监听服务设置为开机自启动,Oracle数据库服务设置为开机延时启动,按道理这个应该符合“先启动监听,后启动数据库服务”这个条件,但是每次断电重启后都是数据库服务正常启动了,监听服务没能启动. 查阅了一下,有这么两个说法,感觉还是挺有道理: 1.一般设置了开机自启动的服务要手动,基本是注册表不一致造成: 2.登录账号跟你安装Oracle的账号不一样,没权限启动. 针

Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.content.BroadcastReceiver;  import android.content.Context;  import android.content.Intent;  import android.net.ConnectivityManager;  import android.ne

Android监听Home键的完美解决方案

相信有不少朋友在开发过程中需要监听HOME键的需求,现本人将代码奉上,希望对大家有所帮助! import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; public class HomeWatcher { private static final String TAG = "

Android CTS测试

一什么是CTS CTS简介:Compatibility Test suite系列兼容测试 google定义了一个兼容性规范(Compatible Definition),而CTS就是为了确保某个测试符合该规范.从而基于Android的应用程序能在基于同一个api版本的设备上面运行.通过CTS测试的device可以获得android的商标,并且享受android market的权限. 例如手机.平板电脑.车载娱乐系统:严格来说需要下载第三方应用的Android系统都要通过CTS测试,才能达到兼容性

【Android代码片段之八】监听Android屏幕是否锁屏

实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发生改变时才会发出广播: 2)如果要在屏幕状态发生改变之前就想获取屏幕状态,可以通过反射机制调用PowerManager的isScreenOn方法 . 具体实现,见代码: 实现Screen状态监听的类ScreenObserver,实现如下: [java] view plaincopy package 

从网页监听Android设备的返回键

最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App.如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流. 之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊…… 用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App.然而这个返回键的被按下的时候网页完全不知道啊(onbeforeunload不算),找不到直接的办法去监听,愁死我们这全苦逼

关于动态监听的一些测试

昨天做了一个实验,环境是这样的,建立一个静态监听端口1526以及一个动态监听端口1521,并且要通过在tnsname用两种连接字符串进行连接,静态连接的字符串直接连接没有问题,可是后来动态连接的字符串怎么也连接不进去,尝试注册 SQL> alter system register; System altered. [[email protected] ~]$ lsnrctl stat LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 26

监听Android的Home键碰到的问题

Android的TV监听Home键切换信源碰到的问题 实现的功能是按下Home键,焦点放到TV小窗口上,再次按下Home键,切换信源,进入另一个信源.在另一个信源的显示下,按下Home键,原信源视图缩小并显示当前信源. 这个需求的解决代码比较容易的.实现一个BroadCastReceiver,监听Home键.但是依照HOME键的实现的时候,系统会切换到当前Launcher,因此,在当前信源的情况下点击HOME键,走的流程是: onPause->onStop->onRestart->onS