您的位置:首页 > 移动开发 > Android开发

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)) { // 解锁

}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: