우리가 흔히 만보기 어플리케이션을 만들 때 사용하는 센서로 걸어가는 동작을 하였는지 감지하며 발을 내디뎌 땅에 닫는 순간 리턴 값을 보내 주는 센서 입니다.



1. Sensor event data


1.1 걸음 감지 센서 이벤트 값


센서가 작동되면 움직임을 감지 하고 있다가 걷기 동작이 진행 되면 감지될 때마다 동일 하게 1.0의 리턴 값을 받아 올 수 있습니다.

걷기 동작의 감지 유무만 확인하여 매번 동일한 값을 보내주기 때문에 이 센서를 사용하여 만보기를 만든다면 계속 덧셈을 해줘야 하는 작업이 필요 합니다.  그리고 덧셈한 최종 값은 어디엔가 저장을 해야 하겠죠.



1.2 센서의 이벤트 비율(rate)


센서로부터 얼마나 자주 값을 받을 것인가에 대한 설정은 registerListener() 메소드를 이용하여 설정 합니다.

- SENSOR_DELAY_NORMAL : 200,000 microsecond delay

- SENSOR_DELAY_UI : 60,000 microsecond delay

- SENSOR_DELAY_GAME : 20,000 microsecond delay

- SENSOR_DELAY_FASTEST : 0 microsecond delay



2. 걸음 감지 센서 프로그램



2.1 신규 프로젝트 생성


프로젝트 명을 적당하게 명명해서 생성 하고 기타 설정 사항도 본인의 기호에 맞게 설정 하여 신규 프로젝트를 하나 생성 합니다.



2.2 Layout 작성


센서 작동에 대한 간단한 테스트만 진행 하기 때문에 센서에서 오는 값을 출력 할 수 있을 정도의 화면만 구성 합니다.

어플리케이션을 작동 시켰을 때 초기 화면에 보여주는 값들 입니다.


- TextView를 하나 만들고 idtvTitle로 정의합니다. 

   textandroid:text="Step Detector Sensor" 이렇게 적어주고 이 값은 변경하지 않을 값입니다.


- TextView를 하나 더 생성 하고 idtvStepDetector 라고 정의해 둡니다.

   TYPE_STEP_DETECTOR Sensor 센서로부터 받아온 값을 출력할 때 사용 할 용도 이며

   textandroid:text="Step Detect : 0" 으로 초기 값을 일단 적어 줍니다.


- activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Step Detector Sensor"
        android:layout_marginTop="50dp"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/tvStepDetector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Step Detect : 0"
        app:layout_constraintTop_toBottomOf="@+id/tvTitle"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        />
</android.support.constraint.ConstraintLayout>


2.3 MainActivity.java


1) class implement


센서로 부터의 값을 받아 올 수 있도록 classSensorEventListenerimplements 시켜 줍니다.

onSensorChanged()onAccuracyChanged() 함수를 override 할 수 있습니다.


2) 변수 정의


프로그램 내에서 사용할 변수(SensorManager, Sensor, TextView, int)들을 정의 합니다.


3) onCreate()


설정한 변수들에 값을 할당 하고 TYPE_STEP_DETECTOR 센서가 핸드폰에 있는지 확인 합니다.

센서가 없으면 Toast를 이용해 화면에 잠시 메시지를 하단에 팝업으로 보여 줍니다.


4) onPause(), onResume()


Sensor는 다른 어플리케이션을 사용하기 위해 일시 중지 되거나 화면을 종료(turn off)해도 계속 작동하고 있으며 전력을 소모하고 있습니다.


이를 방지하기 위해서는 어플리케이션을 완전 종료하거나 다른 어플리케이션에 의해 일시 중지되는 경우 센서의 작동을 중지 시켜주고 이벤트를 받아 다시 센서관련 어플리케이션이 활성화 되었을 경우 작동이 되도록 하여야 합니다.


그러기 위해서 onPause()에서는 중지하고 onResume()에서는 활성화 하도록 코드를 추가 합니다.


5) onSensorChanged()


실제 센서의 작동과 관련된 함수입니다. 센서는 동작을 감지 하면 이벤트를 발생하여onSensorChanged 함수에 값을 전달 합니다.

이벤트가 발생하여 함수에 전달한 값은 1.0 입니다. 

이 값을 이용하여 변수를 1씩 증가시켜 화면에 정의된 TextView에 값을 넘겨 주도록 합니다.

어플리케이션을 실행해 보면 카운트가 1씩 증가하는걸 볼 수 있습니다.


public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor stepDetectorSensor;
    TextView tvStepDetector;
    private int mStepDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvStepDetector = (TextView)findViewById(R.id.tvStepDetector);
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        stepDetectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        if(stepDetectorSensor == null) {
            Toast.makeText(this, "No Step Detect Sensor", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, stepDetectorSensor, SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
            if(event.values[0] == 1.0f) {
                mStepDetector++;
                tvStepDetector.setText("Step Detect : " + String.valueOf(mStepDetector));
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}



3. 결과


3.1 결과 화면


프로젝트를 가상 디바이스가 아닌 실제 핸드폰에서 실행하고 잠시 걸어 다니면서 테스트한 결과 아래와 같은 화면이 나옵니다.


어플리케이션을 종료한 후 다시 시작하면 값이 초기화 되어 Step Detect : 0 으로 되며 다시 1씩 증가하게 됩니다.




3.2 Source Code


첨부된 소스파일을 다운받아 적당한 곳에 압축을 풀고 Android Studio를 이용하여 File > Open 메뉴로 프로젝트 열고 실행을 합니다.


테스트를 위해서 Target Device는 개인 핸드폰으로 설정을 합니다.


각자 설치된 android studio 버전의 차이와 lib들에 차이가 있어 어플리케이션을 Run 하면 update가 필요 하기도 하고 압축을 풀어놓은 디렉토리가 제가 개발을 진행한 디렉토리 정보와 차이가 나서 오류가 발생 하기도 합니다.


업데이트는 잠시 기다리며 finish를 기다려 줍니다.


만약 실행 중 팝업으로 오류가


Installation failed with message Invalid File: E:\android\app\build\intermediates\split-apk\debug\slices\slice_3.apk


이것 비스무리 하게 발생한다면 Android Studio 상단 Build 메뉴 에서


Build > Clean Project

Build > Rebuild Project


메뉴를 이용하여 기존 Build 정보를 삭제 하고 다시 실행 하면 될 것 입니다.


StepDetector.7z



3.3 APK File


Android Studio가 없거나 설치가 귀찮으면 첨부된 APK 파일을 이용하여 핸드폰에서 실행해도 됩니다.

처음 설치를 하려고 하면 출처를 알 수 없은 앱을 굳이 설치 하려고 하느냐고 물어보는데 그럴꺼라고 설정을 해야 설치됩니다. 

테스트 후에는 다시 출처를 알 수 없는 앱 설치 가능을 차단 해 줍니다.

어디서 설정을 변경 했는지 모르겠다 싶으면 핸드폰에 있는 은행 앱을 하나 실행해 봅니다.

그러면 출처를 알 수 없는 앱 설치 설정 기능을 차단하라고 메시지가 나오면서 변경할 수 있는 위치로 이동할 수 있도록 되어 있으니 바꿔주면 됩니다.


프로그램 보다 헛소리가 더긴 글이넹


stepDetector.apk


- copy coding -

핸드폰에 내장된 근접 센서는 전화를 받을 때 화면을 귀나 볼로 터치 해서 엉뚱한 작동을 하지 못하게 하기 위해 화면을 잠그거나 할 때 사용합니다. 

물론 스피커 폰을 사용하거나 ARS등의 서비스를 이용하기 위해 몸에서 멀어지면 다시 화면이 켜지게 됩니다.



1. Sensor event data


센서를 작동 시키면 각 센서마다 이벤트가 작동하여 리턴 값을 받아 올 수 있습니다.

이 값이 바로 우리가 필요로 하는 값으로 각 센서 별로 이벤트 개수 및 값이 다르게 전달 됩니다.

근접 센서는 1개의 이벤트 값을 받을 수 있고 그 수치의 단위는 센티미터(cm) 입니다.

 


1.1 근접 센서 이벤트 값



근접 센서가 작동을 하면 값이 변경 될 때마다 이벤트가 발행 하고 그 값을 넘겨주게 되어 있습니다.

그럼 이론 상으로는 그 값을 받아서 어플리케이션을 작성하면 됩니다.

원래 proximity sensor는 이벤트 값으로 물체와의 거리를 넘겨줘야 하지만 안타깝게도 대부분의 핸드폰들은

멀거나 가깝거나 두 가지만 감지할 정도의 간단한 기능을 가진 센서를 내장하고 있습니다.


 Sensor

 Sensor event data

 표현 값

 측정 단위

 TYPE_PROXIMITY

 SensorEvent.values[0]

 물체와의 거리

 cm



1.2 센서의 이벤트 비율(rate)


센서로부터 얼마나 자주 값을 받을 것인가에 대한 설정은 registerListener() 메소드를 이용하여 설정 합니다.


- SENSOR_DELAY_NORMAL : 200,000 microsecond delay

- SENSOR_DELAY_UI : 60,000 microsecond delay

- SENSOR_DELAY_GAME : 20,000 microsecond delay

- SENSOR_DELAY_FASTEST : 0 microsecond delay

 


2. 근접센서 프로그램


2.1 신규 프로젝트 생성

신규로 프로젝트를 생성 하고 프로젝트 명 및 기타 사항은 본인의 기호에 맞게 설정 합니다.

2.2 AndroidManifest.xml


어플리케이션에 대한 정보를 담고 있는 AndroidManifest.xml에 근접 선서 사용 권한을 기입한다.
<uses-permission android:name="android.hardware.sensor.proximity"/>
테스트 해보니 이 설정을 해도 그만 안해도 그만인 것 같다.  근접 센서를 가지고 좀더 상세한 어플리케이션을 만들 때는 필요할지 모르겠네요.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.will.proximitysensor">
    <uses-permission android:name="android.hardware.sensor.proximity"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


2.3 Layout 작성


센서 작동에 대한 간단한 테스트만 진행 하기 때문에 센서에서 오는 값을 출력 할 수 있을 정도의 화면만 구성 한다.

tvTitle TextView는 고정해서 Proximity Sensor를 출력 하고 센서로부터 받아온 값은 tvProximity TextView에 출력 한다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Proximity Sensor"
        android:layout_marginTop="50dp"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/tvProximity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvTitle"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="20dp"
        android:text="0"
        />
</android.support.constraint.ConstraintLayout>



2.4 Java Source


Sensor는 다른 어플리케이션을 사용하기 위해 일시 중지 되거나 화면을 종료(turn off)해도 계속 작동하고 있으며 전력을 소모하고 있습니다.

이를 방지하기 위해서는 어플리케이션을 완전 종료하거나 다른 어플리케이션에 의해 일시 중지되는 경우 센서의 작동을 중지 시켜주고

이벤트를 받아 다시 센서관련 어플리케이션이 활성화 되었을 경우 작동이 되도록 하여야 합니다.

그러기 위해서 onPause()에서는 중지하고 onResume()에서는 활성화 하도록 코드를 추가 합니다.

 

- 센서로 부터의 값을 받아 올 수 있도록 classSensorEventListenerimplements 시켜 줍니다.

- 받아온 값을 보여줄 TextView를 대입 합니다. : tvProximity = (TextView)findViewById(R.id.tvProximity);

- Sensor proximitySensor 센서를 선언하고 sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 근접선세의 값을 할당 합니다.

- 근접 센서가 없으면 Toast를 이용해 화면에 잠시 메시지를 보여 줍니다.

- onSensorChanged() 함수에서 이벤트 값을 이용하여 0인 경우 [Near]이라고 표시하고 그 이외에는 [Far]와 거리를 표기 합니다.

  정교한 센서가 아닌 경우 대부분 5.0 또는 9.0만 표시 됩니다.

public class MainActivity extends AppCompatActivity implements SensorEventListener{

    private SensorManager sensorManager;
    TextView tvProximity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvProximity = (TextView)findViewById(R.id.tvProximity);
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        Sensor proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        if(proximitySensor == null) {
            Toast.makeText(this, "No Proximity Sensor Found", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
            if(event.values[0] == 0) {
                tvProximity.setText("Near : " + String.valueOf(event.values[0]));
            } else {
                tvProximity.setText(" Far :" + String.valueOf(event.values[0]));
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        switch (accuracy) {
            case SensorManager.SENSOR_STATUS_UNRELIABLE:
                Toast.makeText(this, "UNRELIABLE", Toast.LENGTH_SHORT).show();
                break;
            case SensorManager.SENSOR_STATUS_ACCURACY_LOW:
                Toast.makeText(this, "LOW", Toast.LENGTH_SHORT).show();
                break;
            case SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM:
                Toast.makeText(this, "MEDIUM", Toast.LENGTH_SHORT).show();
                break;
            case SensorManager.SENSOR_STATUS_ACCURACY_HIGH:
                Toast.makeText(this, "HIGH", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}



3. 결과


3.1 결과 화면


프로젝트를 실행 할하고 AVD Manager에서 생성한 가상 디바이스가 아닌 실제 핸드폰에서 테스트한 결과 아래와 같은 화면이 나옵니다.


proximity sensor android



3.2 Source Code


첨부된 소스파일을 다운받아 적당한 곳에 압축을 풀고 Android Studio를 이용하여 File > Open 메뉴로 프로젝트 열고 실행을 합니다.

테스트를 위해서 Target Device는 개인 핸드폰으로 설정을 합니다.

각자의 개발 툴 버전이 달라 update가 진행 되기도 하고 개발을 진행한 디렉토리 정보등의 환경도 차이가 나서 오류가 발생 하기도 합니다.

만약 실행 중 팝업으로 오류가

Installation failed with message Invalid File: E:\android\app\build\intermediates\split-apk\debug\slices\slice_3.apk

이것 비스무리 하게 발생한다면 Android Studio 상단 Build 메뉴 에서

Build > Clean Project

Build > Rebuild Project

메뉴를 이용하여 기존 Build 정보를 삭제 하고 다시 실행 하면 됩니다.


ProximitySensor.7z


 

3.3 APK File


Android Studio가 없거나 귀찮아 첨부된 APK 파일을 이용하여 핸드폰에서 실행을 하려면 출처를 알 수 없은 앱 설치를 가능하게 하고

실행을 해야 합니다. 

테스트 후에는 다시 출처를 알 수 없는 앱 설치 가능을 차단 해 줍니다.

어디서 설정을 변경 했는지 모르겠다 싶으면 핸드폰에 있는 은행 앱을 하나 실행 하면 출처를 알 수 없는 앱 설치 설정 기능을 차단하라고

메시지가 나오면서 변경할 수 있는 위치로 이동할 수 있도록 되어 있으니 바꿔주면 됩니다.


ProximitySensor.apk


- copy coding -


핸드폰을 구매하고 몇 년 후 다시 새로운 핸드폰을 구매 할 때까지 한번 사용해 보기는 커녕 그런 앱이 있는지 조차 알지도 못하는

수많은 앱이 설치되어 있습니다.

앱은 그나마 볼 수라도 있지만 껍데기로 가려진 손바닦 만한 핸드폰에는 이름도 생소한 장치들이 빼곡히 들어 차 있습니다. 

저는 스스로 찾아서 사용 하는 센서 종류를 세어본다면 다섯 손가락도 다 못 꼽을 정도로 사용을 하고 있네요. 

화면 자동 회전도 뉴스 좀 읽다가 지하철이 흔들리면 헤까닥 뒤집어져서 짜증이나 사용 안하고, 자동 밝기도 사용 안하고,

GPS 이용 길 찾기는 미리 데스크탑에서 한번 지도보기와 거리 뷰를 검색하고 가기 때문에 거의 사용할 일이 없고, 

그냥 전화 걸기와 문자 보내기만 사용하고 있으니 압력센서, 근접 거리 센서 정도만 나도 모르게 사용하고 있는 듯 합니다.

진동도 일할 때 가끔 놀라게 해서 무음.

집에 쌓여만 가는 철지난 공기계들 속에는 무슨 센서가 있는지 궁금해서 한번 알아보기로 했습니다.



1. Android Sensor 분류


안드로이드 폰에 들어있는 센서들은 크게 3가지로 분류를 하고 있습니다.


1.1 운동 센서(Motion Sensor)

세개의 축을 기준으로 가속력과 회전력을 측정하는 센서로 종류로는 가속도계(accelerometer), 중력 센서(gravity sensor),

자이로스코프(gyroscope), 회전 벡터센서(rotational vector sensor)등이 있습니다.

 

1.2 환경 센서(Environment Sensor)

주변 환경에 대한 온도, 압력, 조도, 습도와 관련된 변수 들을 측정하며 기압계(barometer), 광도계(photometer),

습도계(thermometer) 등이 있습니다.

 

1.3 위치 센서(Position Sensor)

기기(핸드폰)의 물리적 위치에 대한 측정 값으로 방위 센서(orientation sensor), 자력계(magnetometer) 등이 있습니다.

 

2. Android Sensor 종류 및 메소드


2.1 Android Sensor.


 Type

 센서

 값

 설명

 int

 TYPE_ACCELEROMETER

 1 

 가속도 감지, 외부의 충격량과 방향 감지 센서

 int

 TYPE_ALL

 -1 

 모든 센서

 int

 TYPE_AMBIENT_TEMPERATURE

 13 

 주위 온도 감지 센서

 int

 TYPE_GAME_ROTATION_VECTOR

 15 

 보정되지 않은 회전 벡터 센서

 int

 TYPE_GEOMAGNETIC_ROTATION_VECTOR

 20 

 지자기 회전 벡터

 int

 TYPE_GRAVITY

 9 

 축의 방향과 중력 감지

 int

 TYPE_GYROSCOPE

 4 

 회전 정보 감지, 다양한 축의 회전각 감지

 int

 TYPE_LIGHT

 5 

 빛의 세기 감지 센서

 int

 TYPE_MAGNETIC_FIELD

 2 

 자기장 센서

 int

 TYPE_MOTION_DETECT

 30 

 움직임 감지 센서

 int

 TYPE_ORIENTATION

 3 

 방향각 감지 센서

 int

 TYPE_PRESSURE

 6 

 압력 센서

 int

 TYPE_PROXIMITY

 8 

 근접한 물체와의 거리 감지 센서

 int

 TYPE_RELATIVE_HUMIDITY

 12 

 상대 습도 센서

 int

 TYPE_ROTATION_VECTOR

 11 

 회전 벡터 센서

 int

 TYPE_SIGNIFICANT_MOTION

 17 

 중요한 모션 트리거 센서

 int

 TYPE_STEP_COUNTER

 19 

 발걸음 횟수 센서

 int

 TYPE_STEP_DETECTOR

 18 

 발걸음 감지 센서

 int

 TYPE_TEMPERATURE

 7 

 온도 감지. API level 14에서 사용


2.2 Sensor Method


 Type

 Method

 설명

 int

 getType()

 센서의 타입

 String

 getName()

 센서의 이름

 float

 getPower()

 전력 사용량 밀리 암페어(mA)

 float

 getResolution()

 해상도

 float

 getMaximumRange()

 최대 측정 범위

 String

 getVendor()

 제조사

 int

 getVersion()

 버전

 int

 getId()

 ID

 int

 getMinDelay()

 두 이벤트간 최소 지연 마이크로 초

 String

 toString()

 센서에 대한 간략 정보



3. Android Sensor 리스트


위에서 나열한 메소드를 이용한 실제 프로그램을 통해서 어떤 센서 들이 들어있는지 확인을 해 보도록 하는데 너무 간단해서 설명이 필요 없을 듯 합니다.


3.1 프로젝트 생성


Android Studio 를 이용하여 프로젝트를 하나 생성 합니다. 설정 값들은 기본으로 해서 [Next] 버튼을 이용하여 계속 넘어 갑니다.

Device 선택 화면에서 저는 API 14를 선택 해서 생성 했습니다. 본인이 테스트 하려는 것 보다 버전이 낮으면 아무거나 선택 하셔도 됩니다.





3.2 화면 구성 설정


단순히 센서 리스트만 보여 주기 때문에 스크롤이 될 수 있도록 만들어 줍니다.


- activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <TextView
            android:id="@+id/listSensor"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ScrollView>

</android.support.constraint.ConstraintLayout>



.

3.3 Main 프로그램


onCreate() 함수에서 다 지지고 볶고 끝났네요. 2.1의 센서 종류에서 전체(TYPE_ALL)를 이용하여 2.2 Method로 출력을 하면 됩니다. 

데이터가 많아서 주석 처리한 부분이 있는데 주석을 삭제 하거나 필요한 자료가 더 있으면 method를 참고하여 추가해 주고 실행을 합니다.

핸드폰 화면 말고 Android studio에서도 센서 리스트를 확인 하려면 Log.d()를 사용하여 실행 하면 Logcat에도 리스트를 뿌려 줍니다. 

로그를 보시면 알겠지만 sensor.toString() 이것만 사용해도 기본 정보를 확인 할 수 있습니다.


- MainActivity.java

public class MainActivity extends AppCompatActivity {

    private String TAG = "Sensors";
    private SensorManager sensorManager;
    private String sSensorList = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView txtSensor = (TextView)findViewById(R.id.listSensor);

        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> lstSensor = sensorManager.getSensorList(Sensor.TYPE_ALL);
        for(int i=0; i<lstSensor.size(); i++) {
            Sensor sensor = lstSensor.get(i);
            sSensorList += "Name : " + sensor.getName() + "\n" +
                           "Vendor : " + sensor.getVendor() + "\n" +
//                           "Version : " + sensor.getVersion() + "\n" +
//                           "Power : " + sensor.getPower() + "\n" +
//                           "Type : " + sensor.getType() + "\n" +
                             "toString : " + sensor.toString() + "\n" +
            "";
        }
        txtSensor.setText(sSensorList);
        Log.d(TAG, sSensorList);
    }
}



4. 결과


4.1 결과 화면


프로젝트를 실행 할때는 AVD Manager에서 생성한 가상 디바이스를 사용하지 말고 실제 핸드폰에서 테스트 해보세요.

그러면 아래와 같은 화면이 나옵니다.


android sensor 센서



4.2 Source Code


첨부된 소스파일을 적당한 곳에 압축을 풀고 Android Studio를 이용하여 File > Open 메뉴로 프로젝트 열고 실행을 합니다.

Target Device는 개인 핸드폰으로 설정을 합니다.


만약 실행 중 팝업으로 오류가

Installation failed with message Invalid File: E:\android\app\build\intermediates\split-apk\debug\slices\slice_3.apk

이것 비스무리 하게 발생한다면 Android Studio 상단 Build 메뉴 에서

Build > Clean Project

Build > Rebuild Project

메뉴를 이용하여 기존 Build 정보를 삭제 하고 다시 실행 하면 됩니다.


SensorFind.7z


4.3 APK File


Android Studio가 없거나 귀찮아 첨부된 APK 파일을 이용하여 핸드폰에서 실행을 하려면 출처를 알 수 없은 앱 설치를

가능하게 하고 실행을 해야 합니다.

테스트 후에는 다시 출처를 알 수 없는 앱 설치 가능을 차단 하거나 나중에 은행 앱을 실행 할때 이 기능을 차단하라고

다시 메시지가 뜨면 바꿔주면 됩니다.


SensorFind.apk


- copy coding -

컴퓨터로 작업을 하다 보면 부득이하게 그날 완료를 못하고 퇴근을 하거나 중간에 외근을 나가야 하는 상황이 발생 하는데 현재까지의 작업 환경을 다시 준비하기 힘들 경우 화면 잠금만 하고 퇴근을 하는 날이 있습니다. 그러나 다음날 출근을 하면 컴퓨터가 혼자 [다시 시작]을 해서 깨끗하게 정리를 하고 나를 반기지만 나는 하나도 반갑지 않으니 설정 값을 변경 해봅시다.




1. 설정에서 자동 업데이트 차단 방법


제일 많이 사용 하는 방법으로 키보드에서 윈도우 키 버튼을 누르고 좌측 하단에서 설정을 선택 합니다.


windows 10 update


설정을 선택하면 설정 관련 메뉴들이 들어있는 팝업 창이 호출 됩니다.



설정 창의 우측 하단에 있는 [업데이트 및 보안] 메뉴를 선택하면 화면이 변경 되고 여기에서 좌측의 [Windows 업데이트]메뉴를 선택 합니다.



우측에 업데이트와 관련된 항목이 나타나면 파란색 글씨의 [고급옵션]을 선택하여 상세 설정 화면으로 이동합니다.



파란색 기다란 라디오 버튼 형태의 켬으로 되어있는 버튼을 클릭해주면 끔으로 변경되고 창을 당으면 완료됩니다.

이렇게 기본적인 방법으로 [설정] 창에서 자동 업데이트 기능을 꺼놓는데 이것 만으로 업데이트 차단이 반영되지 않는 것 같아 다시 몇가지 작업을 추가로 진행 합니다.



2. 업데이트 서비스 차단


이번에는 업데이트와 관련된 서비스를 차단하기 위해 팝업을 여는 과정으로 제일먼저 키보드에서 윈도우 키와 X를 같이 눌러 줍니다. 좌측 하단에 나타나는 메뉴에서 [컴퓨터 관리]를 선택합니다.



단축키를 사용하려고 [컴퓨터 관리(G)]에서 G에 언더바가 되어있어 Alt+G로 생각하고 Alt만 눌러도 팝업이 사라지는데 이때는 그냥 G만 누르면 됩니다.

[컴퓨터 관리] 팝업이 활성화 되었고 좌측메뉴에서 [서비스 및 응용 프로그램]을 선택하여 확장하고 [서비스] 메뉴를 선택하면 우측에 서비스 리스트들을 볼 수 있습니다.

서비스 리스트에서 [Windows Update]를 선택하고 마우스 우측 키를 누르면 설정관련 팝업 메뉴가 나타 납니다.



가장먼저 해야 할일은 [중지(O)]를 선택하여 현재 실행중인 업데이트 서비스를 중지 시키는 것입니다. 물론 중지는 속성 창에서 [중지(T)] 버튼을 사용하여 서비스를 중단할 수도 있습니다. 중지 반영 프로그레스 바가 종료되면 [속성]을 선택하여 속성 팝업을 활성화 시킵니다.



[일반] 탭의 [시작 유형] 콤보박스에서 사용 안 함을 선택하고 [적용] 버튼과 [확인] 버튼을 순서대로 선택 하면 서비스 설정이 반영 됩니다.




3 업데이트 정책 차단


이번에는 업데이트 정책을 설정 해보겠습니다. 정책편집기 창을 활성화 하기 위해서는 명령어를 직접 입력해야 하며 [검색 창]을 이용하려면 윈도우 키 + S를 사용하여 gpedit.msc를 입력 합니다.




실행창을 이용하려면 윈도우 키 + R을 이용하여 팝업 창을 열고 gpedit.msc를 입력합니다.



두 가지 방법 모두 다음과 같이 [로컬 그룹 정책 편집기] 팝업 창을 활성화 합니다.

정책 편집기 창의 좌측 메뉴에서 [컴퓨터 구성] 메뉴의 [관리 템플릿]을 확장 시켜 [Windows 구성 요소]를 선택합니다. 혹시 잘못하여 [사용자 구성]을 확장하는 경우 메뉴 구조는 비슷하지만 우측에 보여지는 내용은 다른 화면이 나타나니 주의해서 다시 선택합니다.

우측 리스트에서 [예약된 자동 업데이트 설치 시 로그온한 사용자가 있을 경우 자동 다시 시작 사용 안함]을 선택하여 우측 마우스를 눌러 [편집]을 선택 하거나 리스트에서 선택한 항목을 더블 클릭 하면 설정 팝업 창이 나타납니다.



[사용 안 함(D)] 라디오 버튼을 선택하고 하단에 있는 [적용(A)] 버튼을 클릭하면 잠시 후 버튼이 음영으로 변하며 적용이 완료 되었습니다.



이번에는 리스트에서 [자동 업데이트 구성]을 찾아 선택하여 설정 팝업을 활성화 시킵니다.



이번에는 아까와는 달리 창에 설정 해야 할 항목들이 좀 있습니다. [사용 안 함]이 아닌 [사용(E)] 라디오 버튼을 선택해 줍니다.  그리고 하단에 가서 [자동 업데이트 구성]을 설정 하는데 3(자동으로 다운로드하고 설치할 때 알림)을 선택하고 날짜와 시간은 새벽이 아닌 내가 확인 가능한 시간으로 설정 하는 게 좋겠죠?

설정이 끝났으면 [적용(A)] 버튼을 클릭하고 작업을 완료 합니다.



이제 다 됐다고 안심하면 가끔 스스로의 머리를 쥐어뜯으며 후회하는 일이 발생합니다.

퇴근 후 본인의 아차 실수 또는 누군가가 노트북 커버를 닫아 주거나 할 때 시스템이 종료 될 수 있고 중요 파일을 업로드 또는 다운로드를 걸어 놓았을 때 설정에 때라 작업이 중단되는 상황이 발생 합니다.




4. 전원 설정


전원 설정이 이곳에 있어 제가 작성하고도 한참을 찾았네요.  주제와 맞지도 않아서 신규로 작성 했습니다.


windows 7 전원 관리와 화면 보호기 설정



windows 10 전원 관리 설정


- copy coding -


1···113114115116

+ Recent posts