프로그램 설치하기


일단 리액트 네이티브를 설치한다.

리액트 네이티브의 공식 문서를 참조하는 편이 좋다. 프로젝트를 생성하기 전 단계까지 따라하면 된다.


https://facebook.github.io/react-native/docs/getting-started.html



웹 스톰을 설치한다.


https://www.jetbrains.com/webstorm/


그리고 안드로이드 스튜디오도 깔아주자. 


안드로이드 스튜디오: https://developer.android.com/studio/install?hl=ko



프로젝트 생성하기


웹 스톰에서 File - New - Project...를 클릭하여 새 프로젝트를 생성한다.



생성할 프로젝트 이름을 practice1로 한 후 create 버튼을 누른다.



다음과 같이 프로젝트가 자동으로 생성된다.




안드로이드 디바이스와 연결하기 - 첫 번째 방법


리액트 네이티브를 안드로이드 디바이스와 연결하는 방법은 두 가지가 있다.


안드로이드 디바이스를 usb로 컴퓨터와 연결시킨다.


웹 스톰 상단에 보면 Run/Debug Configurations를 설정할 수 있는데, 'Android'로 바꾼다. (프로젝트 생성 시에 이미 Android와 iOS가 설정되어있다.)

그리고 옆의 초록색 화살표 아이콘을 클릭하여 run 한다.



그러면 다음과 같은 내용이 콘솔 창에 뜬다.



이제 안드로이드 스튜디오를 켜서  File - Open을 클릭하여 리액트 네이티브와 연결되어 있는 프로젝트를 열자. 

practice1 폴더 안에 android를 열면 된다.



다음과 같이 안드로이드 스튜디오가 열린다.

똑같이 초록색 화살표를 눌러 run 해주면 연결된 안드로이드 디바이스에서 앱이 생성된다!




안드로이드 디바이스와 연결하기 - 두 번째 방법


이 방법은 다소 간단하다.

웹 스톰 터미널 창에 react-native run-android 를 입력하면 된다.




안드로이드에서 Listview를 사용한다면 일반적으로 

  • Listview를 사용하는 "MainActivity.java"
  • Listview 아이템을 정의해놓은 "ListviewItem.java"
  • MainActivity.java와 ListviewItem.java를 연결시켜주는 "ListviewAdapter.java"
가 있다. 

Listview 클릭을 활성화 또는 비활성화 하고 싶다면, ListviewAdapter에서 설정해주면 된다.

ListviewAdapter에는 Listview를 그려주는 함수인
 @Override
    public View getView(int position, View convertView, ViewGroup parent) { }

getView함수를 오버라이딩 할 수 있다.


이곳에서

@Override
    public View getView(int position, View convertView, ViewGroup parent) { 

           // 클릭 활성화
            convertView.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return false;

                }});
           
           // 클릭 비활성화
            convertView.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return true;

                }});

이렇게 하면 된다.

안드로이드로 BLE 통신을 하기 위해 코드를 써 내려가던 중,

Public void onClick (Viewview){
	Switch (view.getId()){
		caseR.id.btn_measure:
		scanLeDevice(true); ...
Private void scanLeDevice (finalbooleanenable){
	mLeScanner.startScan(null, mScanSettings.build(), mScanCallback);
    ...


여기까지는 문제가 없었으나
mScanCallback에서 processResult()가 아니라 onScanFailed로 넘어간다는 것이 문제였다.


Private ScanCallback mScanCallback = new ScanCallback(){
	Private void processResult (final ScanResultresult){
		mBluetoothLeService.connect(mDeviceAddress);
        ... // 이곳이 아니라

Public void onScanFailed (int errorCode){} // 이곳으로 넘어간다! 


디버깅을 했을 때, onScanFailed에서 error code=2(SCAN_FAILED_APPLICATION_REGISTRATION_FAILED)가 나왔다. error code 2의 내용은 Fails to start scan as app cannot be registered 이다. 
앱이 등록되지 않아서 스캔을 시작하지 못했다고 하는데 도통 이유를 알 수 없었다.

이틀을 헤맨 결과 코드상의 문제가 아니었다.

AndroidManifest 내에서




ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION 권한을 설정했으나, 권한 허용을 묻는 팝업창이 나타나지 않는게 문제였다. 이 팝업창이 나타나지 않으니  자체의 권한이 설정되어 있지 않았었다. 앱을 개발하면서 재설치를 수없이 하다보니 앱 안에서 무언가 혼선이 생긴 듯 했다. 

 > 환경설정 > 애플리케이션 > 권한 > 위치와 저장 공간의 권한 허용
을 하면 문제는 깔끔히 해결된다!

+ 마시멜로 버전부터는 BLE 권한을 따로 부여해야 한다고 한다.
checkSelfPermission, shouldShowRequestPermissionRationale를 키워드로 찾아보면 될 듯 하다.
이 부분은 아직 공부가 부족하기 때문에 자세한 설명은 나중에..

'안드로이드' 카테고리의 다른 글

안드로이드 Listview 클릭 활성화/비활성화  (0) 2018.11.02

+ Recent posts