Android设备测试应用总结
2016-05-16 18:24
399 查看
Android设备测试应用总结
一个多月没有来写新的文章了,因为之前在忙着学习新的东西,接着又做了一个用来测试的APP,到今天算是有时间写一下博客,主要是对这个应用做一个总结,会是一篇不短的文章,涉及到Android设备的大多数方面功能。文章应该会分几次完成,会尽量找空闲时间写完。关于测试的部分主要包括以下:
电池测试
LCD测试
麦克风+喇叭
耳机麦克+耳机
TF卡测试
SIM卡测试
摄像头测试
陀螺仪测试
加速度测试
GPS测试
按键测试
Android设备测试应用总结
电池测试
总体设计
实现方式
电池代码
LCD测试
总体设计
实现方式
切换背景代码
麦克风测试
整体设计
实现方式
录音播放代码
耳机麦克测试
整体设计
实现方式
耳机是否插入代码
TF卡测试
整体设计
实现方式
TF卡读取代码
SIM卡测试
总体设计
实现方式
读取SIM卡代码
摄像头测试
总体设计
实现方式
摄像头部分代码
陀螺仪测试
总体设计
实现方式
陀螺仪实现代码
加速度测试
总体设计
实现方式
加速度实现代码
GPS测试
总体设计
实现方式
GPS部分代码
按键测试
整体设计
实现方式
按键部分代码
电池测试
总体设计
该功能主要用于对设备的电池进行测试,查看电池在充电状态、放电状态下各项数据是否正常。获取的指标为当前电量、总电量、电压、电池温度,通过以上几个指标完成对电池大致情况的监控。实现方式
以上数据通过监听获取,从监听Intent中获取所需要的主要值。当监听到电池状态发生改变时,获取各项与电池相关的数据,并实时显示数据。电池代码
/**1.过滤action**/ IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); /**2.解析数据**/ int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); //电量最大值 int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); //电池温度 int temperature = batteryStatus.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1); //电压 int voltage = batteryStatus.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1); //充电状态 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
LCD测试
总体设计
参考LCD测试流程,了解LCD测试的需要后,设计了该项测试,监听点击事件,每次点击后更换屏幕显示内容,内容按顺序分别为红、黄、蓝、黑、灰、红黑渐变、彩色条、灰度渐变条,通过依次显示以上内容帮助测试人员测试LCD的显示情况。实现方式
为简化测试过程中的操作并最大化显示LCD内容,为Activity中的父布局设置点击监听,并设置全局变量计数,各个计数对应不同的显示内容。每次点击都会切换一次显示内容,以此达到测试目的。切换背景代码
/**切换背景**/ public void onClick(View v) { int mode = TestApplication.getMode(); switch (v.getId()){ case R.id.ll_lcd_background: switch (index) { case 1: ll_lcd_background.setBackgroundColor(Color.RED); break; case 2: ll_lcd_background.setBackgroundColor(Color.YELLOW); break; case 3: ll_lcd_background.setBackgroundColor(Color.BLUE); break; case 4: ll_lcd_background.setBackgroundColor(Color.BLACK); break; //......省略...... } } }
麦克风测试
整体设计
用于测试设备的麦克风及外放功能,并且为避免疏漏耳机部分的录音与播放,讲两个测试拆分,并且判断当前耳机是否存在。完成录音后将文件保存在本地,停止录音后直接播放该录音。实现方式
判断当前耳机插入状态,根据状态设置测试按钮是否可用,使用MediaRecorder进行录音,使用MediaPlayer播放录音。在录音完成后设置播放可用,播放完成后再设置录音可用。需要耳机状态权限(MODIFY_AUDIO_SETTINGS),需要录音权限(RECORD_AUDIO)录音、播放代码
/**录音功能**/ MediaRecorder mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /**设置录音文件输出位置**/ mRecorder.setOutputFile(getCacheDir().getAbsolutePath() + "/audiorecordtest" + ".3gp"); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); } //开始录音 mRecorder.start();
/**播放功能**/ MediaPlayer mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(getCacheDir().getAbsolutePath() + "/audiorecordtest" + ".3gp"); mPlayer.prepare(); mPlayer.start(); tv_voiceio.setText("停止录音并开始播放..."); //设置播放完成监听 mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { bt_voiceio.setEnabled(true); flag_state = 0; //修改显示 tv_voiceio.setText("等待录音"); bt_voiceio.setText("录音"); } }); } catch (IOException e) { e.printStackTrace(); }
耳机麦克测试
整体设计
这一项测试内容和麦克测试没有本质区别,主要为分辨耳机麦克与麦克两种录音方式。实现方式
同上一测试耳机是否插入代码
/**判断耳机是否插入**/ AudioManager manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); if(manager.isWiredHeadsetOn()){ //耳机插入 }else{ //耳机未插入 }
TF卡测试
整体设计
获取设备的外部存储空间,但是设备不同,外部存储空间的路径也不同,因此需要读取系统文件获取路径,再通过路径获取存储空间信息。实现方式
Environment.getExternalStorageDirectory()在高版本Android设备中,很有可能指向的是设备内部的存储卡,因此想要获取外部的存储卡就需要获取另外的路径,针对测试的设备,使用的是/storage/extsd作为外部存储卡的路径,通过该路径能够正确的获取外部存储卡的存储空间信息。TF卡读取代码
StatFs localStatFs = new StatFs(new File("/storage/extsd").getPath()); long l1 = localStatFs.getBlockSize(); long l2 = localStatFs.getAvailableBlocks(); long l3 = localStatFs.getBlockCount(); /*********************************************/ "可用空间" + l2 * l1 / 1024L / 1024L + "MB" "总体空间" + l3 * l1 / 1024L / 1024L + "MB"
SIM卡测试
总体设计
要求能够侦测到SIM卡,并且能够读取SIM卡中的基本信息,保证SIM卡能够在设备中正常使用。实现方式
获取通信服务,读取SIM卡的状态,当SIM卡状态正常的情况下,读取SIM卡的指令,判断SIM卡的运营商信息,确保SIM卡与设备之间的通信正常。需要手机状态权限(READ_PHONE_STATE)读取SIM卡代码
TelephonyManager telManager = (TelephonyManager) getSystemService(Context .TELEPHONY_SERVICE); /**判断SIM卡状态是否可用**/ if (telManager.getSimState() == TelephonyManager.SIM_STATE_READY) { tv_sim_state.setText("Sim卡可使用"); //获取SIM卡指令 String operator = telManager.getSimOperator(); if (operator != null) { //根据所获取指令读取运营商信息 if (operator.equals("46000") || perator.equals("46002") || operator.equals("46007")) { operator = "中国移动"; } else if (operator.equals("46001")) { operator = "中国联通"; } else if (operator.equals("46003")) { operator = "中国电信"; } } } else { //Sim卡状态异常 }
摄像头测试
总体设计
针对于该设备的特有部分,摄像头测试和大众设备存在不同,该设备除前置摄像头和后置摄像头外,还存在红外摄像头。不过该部分实现方式不便分享,只提供部分实现思路。实现方式
虽然摄像头数量不同,并且有不同规格的摄像头存在,但是处理的大体方式还是用Camera+SurfaceView。获取可用摄像头数量,为摄像头设置相应参数(分辨率、拍照格式等),为SurfaceView添加回调方法。需要摄像头权限(CAMERA)摄像头部分代码
//获取设备中摄像头总数 int num = Camera.getNumberOfCameras(); if (num != 0) { //打开默认摄像头(后置) mCamera = Camera.open(); initParam(); holder = sv_camera.getHolder(); holder.addCallback(this); }
/**SurfaceView回调**/ @Override public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(holder); mCamera.setParameters(objParam); mCamera.setDisplayOrientation(90); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mCamera.setDisplayOrientation(90); mCamera.setParameters(objParam); } @Override public void surfaceDestroyed(SurfaceHolder holder) { holder.removeCallback(this); }
//关于红外摄像头的调用 1.首先摄像头是需要硬件支持的,不能说没有在这个摄像头的情况下凭空软件造。 2.该功能的实现和自然光摄像头的显示过程是基本相同的 3.具体切换的方式需要与底层开发人员交流,底层会有相应的方法进行切换。可能会有不同的实现方式,根据不同的情况来选择方法。
陀螺仪测试
总体设计
需要测试设备陀螺仪是否能够正常运转,获取陀螺仪数据,通过晃动设备查看陀螺仪数据是否正常,并且设置按钮,用于获取某一瞬间的陀螺仪数据,保证在最大程度静止状态下陀螺仪数据的观测。实现方式
监听设备传感器,当传感器数据发生改变时,检测传感器中陀螺仪部分数据,并实时展示数据,使用按钮获取某一时刻陀螺仪数据,并展示实时数据。陀螺仪实现代码
/*获取SensorManager对象*/ SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
@Override public void onSensorChanged(SensorEvent event) { x = event.values[0]; //陀螺仪X轴数据 y = event.values[1]; //陀螺仪Y轴数据 z = event.values[2]; //陀螺仪Z轴数据 tv_gyroscope.setText("陀螺仪:\n" + "x:" + x + "\ny:" + y + "\nz:" + z); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
加速度测试
总体设计
测试设备加速度是否能够正常运转,实时获取加速度数据,给设备单独提供前后左右上下方向的加速度,提供箭头指向以及通过标示,帮助可视化测试,避免某个方向加速度遗漏测试或测试失败无法观测。实现方式
注册传感器监听,获取实时的加速度数据,每次获取到数据后进行方向判断,预设置各方向箭头用于标记加速度方向,同时设置多个文字标记,根据获取到的某个方向加速度将相应的文字做高亮显示。加速度实现代码
/**这一部分和陀螺仪基本一致**/ SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); /**区别在于TYPE**/ Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(this, sensor , SensorManager.SENSOR_DELAY_NORMAL);
/**获取传感器数据**/ @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; tv_accelerometer.setText("加速度:\n" + "x:" + x + "\ny:" + y + "\nz:" + z); if(x > 9f){ //左 iv_accelerometer.setBackgroundResource(R.mipmap.left); tv_accelerometer_left.setTextColor(Color.GREEN); } if(x < -9f){ //右 iv_accelerometer.setBackgroundResource(R.mipmap.right); tv_accelerometer_right.setTextColor(Color.GREEN); } if(y > 9f){ //下 iv_accelerometer.setBackgroundResource(R.mipmap.down); tv_accelerometer_down.setTextColor(Color.GREEN); } if(y < -9f){ //上 iv_accelerometer.setBackgroundResource(R.mipmap.up); tv_accelerometer_up.setTextColor(Color.GREEN); } if(z > 9f){ //后 iv_accelerometer.setBackgroundResource(R.mipmap.down); tv_accelerometer_back.setTextColor(Color.GREEN); } if(z < -9f){ //前 iv_accelerometer.setBackgroundResource(R.mipmap.up); tv_accelerometer_front.setTextColor(Color.GREEN); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
GPS测试
总体设计
该部分设计比较简单,主要方向是测试设备的gps模块是否能够正常运行,因此展示只需要一个TextView就能完成。实现方式
获取LocationManager来获取定位信息,Criteria控制定位方式,建立位置信息监听获取实时的定位信息。GPS测试需要配置权限GPS部分代码
/***获取LocationManager对象***/ LocationManager locationManager = (LocationManager) getSystemService(Context .LOCATION_SERVICE); //权限检查 Criteria criteria = new Criteria(); criteria.setCostAllowed(true); //是否允许扣费 criteria.setAccuracy(Criteria.ACCURACY_FINE); //精确度设置 criteria.setPowerRequirement(Criteria.POWER_MEDIUM); //耗电量设置(获取频率有关) //获取最佳定位方式 locationManager.getBestProvider(criteria, true); listener = new MyLocationListener(); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 2, listener);
class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { //\n换行非常不专业也不规范,但我就是用了╮(╯▽╰)╭ //换行建议使用System.getProperty("line.separator") //获取系统的换行符,我就懒得改了,但还是建议使用这个方法换行 tv_gps.setText("经度:" + location.getLatitude() + "\n纬度:" + location.getLongitude()+ "\n海拔:" + location.getAltitude()); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { Log.i("GPS", provider + "可用"); Toast.makeText(GpsActivity.this, "GPS可用", Toast.LENGTH_SHORT).show(); tv_gps.setText("GSP可使用"); } @Override public void onProviderDisabled(String provider) { Log.i("GPS", provider + "不可用"); } }
按键测试
整体设计
设置多个TextView用于对应按键的标示,当捕获到按键的事件后,将TextView设置为高亮,标示按键测试通过。对于无法捕获事件的按键通过计数观测按键是否正常。实现方式
主要使用onKeyDown以及锁屏监听来做到按键的效果侦测,对于音量键检测到按键动作就将相应的文本标记为高亮,对于锁屏键检测到动作就进行一次计数(避免无法观测到效果)——可能存在按键按下屏幕唤醒问题,需要计数验证。按键部分代码
/**按键按下监听**/ public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode){ case KeyEvent.KEYCODE_VOLUME_DOWN: tv_button_volume_clu.setText("音量减————按下"); tv_button_volume_clu.setTextColor(Color.GREEN); return true; case KeyEvent.KEYCODE_VOLUME_UP: tv_button_volume_add.setText("音量加————按下"); tv_button_volume_add.setTextColor(Color.GREEN); return true; } return super.onKeyDown(keyCode, event); }
/**设置过滤**/ IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(receiver, filter); /**设置广播**/ BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_SCREEN_ON.equals(action)) { // 开屏 tv_button_wake.setText("唤醒计数" + ++count_wake); tv_button_wake.setTextColor(Color.GREEN); } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 锁屏 tv_button_lock.setText("锁屏计数" + ++count_lock); tv_button_lock.setTextColor(Color.GREEN); } else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 解锁 } } };
相关文章推荐
- Android侧滑菜单之DrawerLayout用法详解
- Android Framework 基于 IPC Binder驱动使用 RPC
- Android Studio运行程序时显示apk not exists
- Vim简明教程
- AlterDialog简单使用一
- android 基础 handler message runnable thread looper
- 获取Android设备上的所有存储设备
- Android 日常开发总结的技术经验 60 条
- Android 仿美团网,大众点评购买框悬浮效果之修改版
- 玩转Android Handler
- Android--中国象棋
- Intent 或持久化存储处理复杂对象
- Android 之优雅代码(一)——巧用assets
- Android之EnventBus
- 平安好医生技术栈的分析
- android使用ant重新编译打包apk
- Android Tips 7
- [Android] Android异步任务机制之AsycTask
- android ExpandableListView实现
- Android的onCreateOptionsMenu()创建菜单Menu详解