Android设备测试应用总结
一个多月没有来写新的文章了,因为之前在忙着学习新的东西,接着又做了一个用来测试的APP,到今天算是有时间写一下博客,主要是对这个应用做一个总结,会是一篇不短的文章,涉及到Android设备的大多数方面功能。文章应该会分几次完成,会尽量找空闲时间写完。
关于测试的部分主要包括以下:
- 电池测试
- LCD测试
- 麦克风+喇叭
- 耳机麦克+耳机
- TF卡测试
- SIM卡测试
- 摄像头测试
- 陀螺仪测试
- 加速度测试
- 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)) { // 解锁
}
}
};