1. 1
2018 Final-term Examination (100)
Architecting Smart Devices
Date: 2018-12-11
1. LocationManager가 LocationListener 등록에 사용하는 함수를 제시하고
GPS_PROVIDER와 NETWORK_PROVIDER의 차이점을 서술하시오. 예를 들어 정밀하게
위치를 추적하기 위해 0.1초에 한 번씩 미세한 위치 변화도 모두 추적할 수 있는 적절
한 함수 입력을 제시하시오. (20)
- LocationListener를 등록하는 함수는 LocationManager. requestLocationUpdates()임
- GPS_PROVIDER는 GPS를 이용해 위치 정보를 획득할 수 있다. NETWORK_PROVIDER는
이동 통신 network이나 WiFi 정보를 이용해 위치 정보를 획득한다. GPS_PROVIDER는
하늘에 떠있는 GPS 위성을 볼 수 있어야 위치 정보가 얻어지지만 위치는 매우 정확하
게 얻을 수 있다. NETWORK_PROVIDER는 실내 혹은 실외에서 위치 정보를 쉽게 얻을
수 있지만 위치 정밀도는 좋지 않다.
- 문제에 제시한 함수 입력은 다음과 같다.
LocationManager. requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0,
LocationListener);
2. 만보계용 Android app을 구성하려 한다. 다음에 답하시오. (40)
1) SensorManager로부터 만보계용 Sensor를 획득하는 code 제시 (10)
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensorAccel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
2) 사용자 걸음 여부를 판단하기 위한 SensorEventListener 구성(property와 method) 제
시 (20)
- SensorEventListener를 상속받은 class는 MySensorListener로 생각
- 가속계가 출력하는 x, y, z축 가속도의 변화를 추적하는 code가 필요하다. 예를 들면
다음과 같다. 가속도 변화값은 diffAccel에 저장된다.
2. 2
public class MySensorListener implements SensorEventListener {
public double oldX, oldY, oldZ;
public double newX, newY, newZ;
public double diffAccel;
public MySensorListener() {
oldX = oldY = oldZ = newX = newY = newZ = 0.;
diffAccel = 0.;
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
newX = event.values[0];
newY = event.values[1];
newZ = event.values[2];
diffAccel = Math.abs(newX – oldX) + Math.abs(newY – oldY) + Math.abs(newZ –
oldZ);
oldX = newX; oldY = newY; oldZ = newZ;
}
}
}
3) SensorEventListener를 SensorManager에 등록하고 해제하는 code를 각각 제시 (10)
- 등록 code
MySensorListener mySensorListener = new MySensorListener();
sensorManager.registerListener(mySensorListener, sensorAccel,
SensorManager.SENSOR_DELAY_NORMAL);
- 해제 code
sensorManager.unregisterListener(mySensorListener);
3. 다음을 Android code로 구현하라. Code는 짧을수록 가산점. (40)
3. 3
1) 10초에 한 번씩 Toast message로 “Wake up”을 출력. Background에 있을 때도 항상
Toast message 출력. Thread.start()를 쓰지 않고 개념적으로만 제시 가능. (20)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
…
Intent intent = new Intent(this, ToastWakeService.class);
startService(intent);
}
}
class ToastWakeService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int nResult = super.onStartCommand(intent, flags, startId);
while (true) {
try { Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(this, "Wake up", Toast.LENGTH_SHORT).show();}
}
return nResult;
}
}
2) 사용자에게 입력받은 문자열이 “start”라면 사용자 발신 전화 정보를 추적하는
BroadcastReceiver를 등록하고, “stop”이 입력되면 이 BroadcastReceiver 등록을 해제하
는 code. BroadcastReceiver 이름은 PhoneCallReceiver로 정하며 이미 있다고 가정함
(PhoneCallReceiver에 대한 code는 작성할 필요 없음). (20)
4. 4
PhoneCallReceiver phoneCallReceiver;
phoneCallReceiver = new PhoneCallReceiver();
EditText etInput;
etInput = (EditText) findViewById(R.id.etInput);
String sInput = etInput.getText.toString();
if (sInput.equals(“start”)) {
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
registerReceiver(phoneCallReceiver, intentFilter);
}
else if (sInput.equals(“stop”)) {
unregisterReceiver(phoneCallReceiver);
}