앱 동작 설계 - USB 접근 권한 얻기
윈도우즈와는 다르게 

안드로이드는 앱이 기능(장치)에 접근하려고 할 때 

권한을 부여할지를 사용자에게 물어본다.

이 권한 없이 장치에 접근하려고 하면 에러가 난다.

그래서, 권한을 얻은 후에 장치에 접근해야 한다.

따라서 앱에서 권한을 부여받은 시점을 알아야 한다.



??? 시나리오 1 : 앱이 실행된 상태에서 USB가 꽂힘

USB 디바이스가 꽂히면

시스템이 대화상자를 띄워 사용자에게 권한을 허락할지를 물어본다.

앱은 ACTION_USB_DEVICE_ATTACHED braodcast를 받은 시점에서 

이미 권한을 부여받은 상태이다.

이렇게 되기 위해서는 앱의 mainfast.xml 파일에 intent 필터를 등록하고,

onCreate에서 registerReceiver(...ACTION_USB_DEVICE_ATTACHED)를 호출해줘야 한다.




??? 시나리오 2 : USB가 미리 꽂힌 상태에서 앱이 실행됨

USB 디바이스에 접근해야 하기 전에 

ACTION_USB_PERMISSION braodcast를 수신할 수 있도록 BroadcastReceiver()를 등록 한 후에,

requestPermission()을 호출한다.

requestPermission()을 호출 하면 시스템 대화상자가 뜨고,

여기에서 사용자가 권한을 부여하면 BroadcastReceiver의 OnReceive가 호출된다.

이 시점에서 디바이스에 접근 가능하다.




코드

mainfast.xml 에 intent 필터 등록,

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />


app>res>xml>device_filter.xml에 

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <!-- usb-device vendor-id="04B4" product-id="8613" class="255" subclass="00" protocol="1" /-->
    <usb-device vendor-id="1CBE" product-id="0003" class="255" />
</resources>

-> mainfast.xml, device_filter.xml의 역할 : 선언된 VID, PID의 USB 장치가 연결되면 이 앱을 실행되함

onCreate에서 
registerReceiver(mUsbDeviceReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED));
registerReceiver(mUsbDeviceReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));

-> registerReceiver() 의 역할 : (어떤 종류에 상관 없이 ) USB 장치가 연결되면 

    private final BroadcastReceiver mUsbDeviceReceiver =
            new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                        ...
                    }else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                        ...
                    }
                }
            };
    로 진입함



테스트 1

폰에 레퍼런스 보드를 연결하면

USB 연결방법 선택창이 뜨고, 설정에서 MCP선택하면

앱이 실행되면서 onReceive() 로 진입





테스트 2

UniHigh 보드를 연결

자동으로 앱이 실행되지 않음

앱이 실행된 상태에서 UniHigh 보드를 꽂았다 뺐다하면 onReceive()로 진입




onReceive()에서 VID, PID로 장치를 구분할 필요가 있다.






by 바람처럼날다 | 2018/03/11 16:24 | 안드로이드 USB I/O보드 | 트랙백 | 덧글(0)
트랙백 주소 : http://muosys.egloos.com/tb/6308456
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >