Android设备测试应用总结

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

        }
    }
};

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值