Designing Apps for Motorla Xoom Tablet


Published on

Presentation from #andevcon by Anna Schaller
Peter van der Linden, Android Technology Evangelists from the Developer Platforms and Services team at Motorola Mobility. More info at

Published in: Technology
  • 자료 요청합니다.
    Are you sure you want to  Yes  No
    Your message goes here
  • Motodev 세미나 프리젠테이션자료라는데..
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • My name is Anna Schaller and I’m part of the Developer Community Tech Services Team at Motorola Mobility. Our job is to support 3 rd party developers writing android apps, especially targeted for Motorola devices.
  • Walkthrough of device from users perspective -- home screen; 5 panels -- upper left is the text and voice search -- upper right is the application tray and add to home screen -- Partial list apps preloaded and optimized for the tablet include -- gmail -- contact -- maps -- browser -- android market -- eBook reader -- google talk -- camera Walkthrough of specs
  • This is a typical Android smartphone. Across the top is your status bar where your status icons appear (battery, wifi, etc). This is also where your notifications can be found. Touching the status bar opens the notification panel. Moving to the bottom of the device, is where you’ll find buttons. Prehoneycomb devices were required to have 3 buttons – menu, home, and back. There’s usually a fourth button (in this case search). So that’s a typical smartphone.
  • When you’re talking about tablets things change. On the hardware side there are only three buttons on the device – volume up, volume down, and power.
  • Then when you talking about the platfom the whole user interface has changed.. From an apps perspective there are a couple things you should be aware of. For instance… You have the system bar along the bottom. The back and home button on the lower left. There is NO menu button. Menus are now all in software and only available from within an application. On the lower right is where your status bar icons now appear as well as you notification panel. From a user perspective there’s much more to it but from a developer’s standpoint, those are the things you should be aware of. They won’t necessarily impact your application but it may change the way you think about things.
  • Select a view that you want to associate the dimmer with (I have an id assigned to my root linearLayout) and set the visibility. You can attach the call to any view (including buttons) so may want to toggle it off and on with a button or putting inside any listener. If you touch the system bar the icons reappear. Touching the view dims the system bar. Book reader is a good example of dimming.
  • Replaces the title bar. This is the simplest form of an action bar. The Action Bar is included by default in all activities that target Android 3.0 or greater (setting minSdk or targetSdk = 11) Basic action bar with an overflow menu. The menu in the action bar replaces the hard menu button on the front of the device. The default behavior for the application icon is to do nothing. The title can be displayed or hidden.
  • Action bars get more feature rich from there. There are many extensions you can make to the action bar including -- actionable application icon with in onOptionsMenuSelected -- adding tabs -- creating individual actionable items with or without text and titles -- Provide a drop-down list for navigation -- Provide a contextual action bar (CAB) -- Provide interactive "action views" in place of action items (such as a search box).
  • One final note on menus. To support forward compatibility a soft menu button is provided along the system bar for pre-honeycomb apps. If you open the menu you can see where and what the menu items looks like.
  • Starting from Android 1.6 and up developers can divide the Activities of their applications into subcomponents called Fragments. Fragments -- can be added, removed, replaced, and animated inside an Activity dynamically -- are modular and reusable across multiple Activities. Here we’ve got the updated version of the contacts app showing the list of contacts in a fragment on the left and the details of the selected contact in a fragment on the right.
  • Fragments can not stand on their own. They must be included in an activity. However fragments are self contained in that they have their own life cycle and every visible fragment has their own UI layout. One of the most common ways to use fragments is to associate a content fragment with an item in a list. There’s a separate type of fragment, called a ListFragment, that lets you do this. The content fragment can contain anything you would normally use in an activity – images, text, ui elements, etc.
  • To add a fragment without a UI, add the fragment from the activity using add(Fragment, String) (supplying a unique string "tag" for the fragment, rather than a view ID)
  • (Nothing changes in the AndroidManifest file) Adding a fragment to an activity requires updates to the activity’s layout file. You must add the fragment to your Activity’s layout file with a <fragment> tag. In the fragment tag you declare the class name of the fragment that’s defined usually in a separate .java file. Pay attention to the root layout or container you use. In this case I used LinearLayout which, by default has a top to bottom placement. So when I first did this app my fragments did not appear side-by-side, they appeared top-to-bottom. I needed to add orientation=horizontal in order to get the side-by-side. The device’s orientation is landscape by default so if you want a portrait version of the app to be top-to-bottom you’ll need to create another layout-port file specifying orientation=portrait.
  • In Android you can get hardware acceleration for 3d graphics through OpenGL ES 2.0 if you are using NDK. There is also software-enabled acceleration for 3d graphics using OpenGL ES 1.x. Until now there has been no support for 2D graphics..
  • Textures improve a 3d model with a visual realism that goes beyond just adding color. However the more detailed the textures become the larger the data size becomes which means that quite often you need to compress the texture data. The challenge for Android-powered devices is that the chipsets used in the devices support different compression types. So what do you do? PVRTC == Motorola Droid series ATITC == HTC S3TC == XOOM, Atrix, Bionic Android Market filters applications according to the texture compression formats that they support, to ensure that they can be installed only on devices that can handle their textures properly. Developers can use texture compression filtering as a way of targeting specific device types, based on GPU platform
  • Android Market filters applications according to the texture compression formats that they support, to ensure that they can be installed only on devices that can handle their textures properly. Developers can use texture compression filtering as a way of targeting specific device types, based on GPU platform
  • Follow instructions for using Data Storage to external media Every Android-compatible device supports a shared storage. Shared files: Music/ - Media scanner classifies all media found here as user music. Podcasts/ - Media scanner classifies all media found here as a podcast. Ringtones/ - Media scanner classifies all media found here as a ringtone. Alarms/ - Media scanner classifies all media found here as an alarm sound. Notifications/ - Media scanner classifies all media found here as a notification sound. Pictures/ - All photos (excluding those taken with the camera). Movies/ - All movies (excluding those taken with the camcorder). Download/ - Miscellaneous downloads. Private files can be placed in /android/data/<appname> folder.
  • In 2.3 (Gingerbread) support for new sensor-based orientation settings were added that better supports 4-way rotation In your manifest at the <activity> node you can specify <activity …. android:orientation=“sensorPortrait” : supports portrait and reverse-portrait android:orientation=“sensorLandscape” : supports landscape and reverse-landscape android:orientation=“fullSensor” : supports 2 and 4-way rotation depending on device X and Y on portrait native device are on different long and short sides than landscape native.
  • Still need to define camera permission to use either camera If you want to filter the app from devices that don’t support front-facing camera add <uses-feature xxx…>
  • There is a new package android.hardware.Camera.CameraInfo that stores properties of each camera. So you import this package, along with the Camera package. The Camera package now lets you get the number of cameras on the device so you can use this as an index to the camera. Once you have that index you can get to the front or rear camera.
  • XOOM screen supports 10-point multitouch – Android supports 5 or more simultaneous independent pointers.
  • Device perspective versus app perspective Think about why you need the unique identifier. If
  • Apps are always forward compatible but……
  • There is no way to make a phone call from the XOOM so dialer app is not there. If you call the dialer from your application it will not launch. Unless you explicitly specify the <uses-feature> tag, permissions imply that features are required. Permissions do not filter an app, the <uses-feature> tag does that. If you request permission for the Telephone without specifying a <uses-feature> tag the default filter is <uses-feature android:hardware.telephony” android:required=“true”/>. In this case your app will be filtered from the XOOM. Also keep in mind that on the wifi-only version of the tablet there is no IMEI or MEID, which in the past has been used as a unique identifier. If you query for it you get NULL. If you need a unique id, use the MAC address.
  • To find out what features may be blocking your app from a device there are two tools you can use: -- Aapt shows explicitly defined features with <uses-feature>. You must use the version of aapt that is provided for the latest Platform-Tools component available. -- MOTODEV App Validator is a web-based tool that lets you pre-test your application and show you where your app might fall through the cracks – such as implied features (permissions defined without a corresponding <uses-feature>). It shows you other things as well such as strings that are not completely localized.
  • There are two new features in 3.1 to support USB. Firstly there is built-in support for USB host mode that lets apps connect and manage peripherals. The device itself must have a USB controller, which the XOOM does. So the XOOM can operate in USB host mode. The second update is USB support for connected devices. There are two types of hardware supported: -- Peripherals can be a USB device meaning that they depend on the Android device to be the USB host. Cameras are a good example of this. -- Peripherals can also be a USB accessory meaning that they operate as the USB host to the Android device. A robotics controller is an example of this. At Google I/O they had an exercise bike with a mounted XOOM. The bike was the host and reported calories burned after pedaling some distance to an app on the XOOM.
  • Designing Apps for Motorla Xoom Tablet

    1. 1. Motorola Mobility Anna Schaller Android 기술 전도사 개발자 플랫폼 및 서비스 Motorola XOOM 용 앱 설계
    2. 2. 환영사 © 2010 Motorola Mobility, Inc. 01 과거와 현재 스마트폰 설계와 태블릿 설계 비교 02 애플리케이션 UI 디자인의 변화 Android 3.0 UI 특징 소개 03 그래픽과 미디어의 변화 그래픽과 미디어 지원에 대한 업데이트 , 향상 및 정보 04 하드웨어 특징 XOOM 하드웨어에서의 Android 지원 05 10 가지…… XOOM 상에서 애플리케이션을 얻기 위한 간편한 단계
    3. 3. 태블릿 소개 <ul><li>스크린 </li></ul><ul><li>10.1&quot;, WXGA(1280 x 800), 160 dpi(mdpi) </li></ul><ul><li>메모리 : 32 GB 플래시 스토리지 </li></ul><ul><li>프로세서 : nVidia Tegra 2 듀얼 코어 </li></ul><ul><li>센서 : 가속도계 , 기압계 , 자이로스코프 , 나침반 , 조도계 , GPS, 근접 또는 진동 없음 , 4- 방향 회전 </li></ul><ul><li>연결 : 802.11 a/b/g/n, Bluetooth, HDMI </li></ul><ul><li>카메라 : 2mp 고정 초점 전방 / 5mp 자동 초점 후방 </li></ul><ul><li>미디어 : 720p HD 비디오 레코딩 , 1080p HD 재생 </li></ul><ul><li>외장 스토리지 : 32 GB SD 카드 ( 지원 예정 ) </li></ul><ul><li>플랫폼 : Android 3.0/3.1(Honeycomb) </li></ul><ul><li>앱 환경 : Adobe AIR 2.6, Android, NDK, Flash 10.3 </li></ul><ul><li>다수의 소프트웨어 변경 사항 </li></ul>
    4. 4. Atrix 구성 상태 표시줄 메뉴 키 홈 키 뒤로 버튼 보너스 버튼 ( 일반적으로 검색 기능 ) 볼륨 키 ( 상 / 하 ) 전원 버튼
    5. 5. XOOM 구성 볼륨 키 ( 상 / 하 ) 전원 버튼
    6. 6. XOOM 구성 시스템 표시줄 메뉴 버튼 아님
    7. 7. 애플리케이션 UI 디자인의 변화 <ul><li>홀로그램 테마 </li></ul><ul><li>시스템 표시줄 희미하게 하기 </li></ul><ul><li>동작 표시줄 </li></ul><ul><li>Fragment </li></ul><ul><li>새로운 위젯 </li></ul><ul><li>알림 업데이트 </li></ul><ul><li>시스템 클립보드 </li></ul><ul><li>드래그 및 드롭 </li></ul>7 페이지 프레젠테이션 제목 버전 1.0 2009 년 2 월 24 일
    8. 8. 홀로그램 테마 <ul><li>Android 3.0 대상으로 구축된 모든 앱에 의해 적용됩니다 </li></ul><ul><ul><li>minSdkVersion 또는 targetSdkVersion = 11 * 및 * 하드웨어 가속 활성화 ( android:hardwareAccelerated= “ true ” ) </li></ul></ul><ul><ul><li>SDK 버전이 9 이하일 경우 애플리케이션은 Android 2.3 의 위젯 디자인을 사용하고 홀로그램 테마를 적용하지 않습니다 </li></ul></ul><ul><li>다음과 같은 두 가지 버전이 있습니다 </li></ul><ul><ul><li>흰색 글자에 파란색 배경인 기본 버전 @android:style/Theme.Holo </li></ul></ul><ul><ul><li>어두운 글자색에 반전된 흰색 홀로그램 @android:style/Theme.Holo.Light </li></ul></ul>
    9. 9. 시스템 표시줄 희미하게 하기 <ul><li>소등 모드 </li></ul><ul><ul><li>아이콘을 홀로그램 “점”으로 대체해 시스템 표시줄을 희미하게 합니다 ( 시스템 표시줄이 없어지지는 않음 ) </li></ul></ul><ul><li> View v = findViewById( view_id); </li></ul><ul><li> v.setSystemUiVisibility( View. STATUS_BAR_HIDDEN ); </li></ul><ul><li> v.setSystemUiVisibility( View. STATUS_BAR_VISIBLE ); </li></ul>
    10. 10. 동작 표시줄 – 기본 <ul><li>앱 상단에 있는 기존의 제목 표시줄을 대체합니다 </li></ul><ul><li>제목이 포함된 애플리케이션 아이콘 </li></ul><ul><li>오버플로 메뉴 </li></ul><ul><ul><li>메뉴 생성은 변경되지 않았습니다 </li></ul></ul><ul><ul><li>public boolean onCreateOptionsMenu(Menu menu) { ... } </li></ul></ul><ul><ul><li>public boolean onOptionsItemSelected(MenuItem item) { </li></ul></ul><ul><ul><li>case ... } </li></ul></ul><ul><ul><li>/res/menu/ menu_definitions.xml </li></ul></ul>
    11. 11. 동작 표시줄 – 동작 항목이 탭으로 표시 <ul><li>애플리케이션 아이콘을 동작 가능 상태로 만들 수 있습니다 </li></ul><ul><li>동작 표시줄에 탭으로 표시되는 인터페이스 </li></ul><ul><li>오버플로 메뉴에 나열하기보다는 각 동작 항목으로 표시 </li></ul><ul><ul><li>텍스트 포함 또는 미포함 ; 아이콘 포함 또는 미포함 </li></ul></ul><ul><li>동작 표시줄을 관리하려면 : </li></ul><ul><ul><li>ActionBar actionBar = getActionBar() ; </li></ul></ul><ul><ul><li>actionBar. setNavigationMode( ActionBar. NAVIGATION_MODE_TABS ) ; </li></ul></ul><ul><ul><li>참조 : </li></ul></ul>“ 동작 가능” 아이콘 탭 동작 항목
    12. 12. 전체 화면으로 전환 - 동작 표시줄 없애기 <ul><li>동작 표시줄을 숨길 수 있습니다 . “ 그러나” 그렇게 하면 애플리케이션에서 메뉴에 접근할 수 없습니다 </li></ul><ul><li><activity android:theme= “@android:style/Theme.NoTitleBar” > </li></ul><ul><li>프로그램을 통해 동작 표시줄을 숨길 수도 있으며 , 이 경우 사용자가 전환하면 됩니다 </li></ul><ul><li>ActionBar bar = getActionBar(); </li></ul><ul><li>if (bar != null) { </li></ul><ul><li>if (bar. isShowing() ) bar. hide() ; </li></ul><ul><li> else bar. show() ; </li></ul><ul><li>} </li></ul>
    13. 13. 메뉴 <ul><li>역호환성을 지원하기 위해 시스템 표시줄과 더불어 소프트 메뉴 버튼이 추가되었습니다 </li></ul><ul><ul><li>minSdkVersion 및 targetSdkVersion < 11 </li></ul></ul>
    14. 14. Fragment <ul><li>애플리케이션을 하위 구성 요소로 나누어 개별적으로 관리하고 다양한 방법으로 결합할 수 있도록 해줍니다 ( 예 : 다중 창 UI 만들기 ). </li></ul>
    15. 15. Fragment( 계속 ) <ul><li>Fragment 는 항상 Activity 에 임베딩되어야 합니다 </li></ul>목록 Fragment Fragment Activity
    16. 16. Fragment( 기본 Fragment) <ul><li>Fragment 를 확장하는 클래스를 만듭니다 </li></ul><ul><li>Activity 와 유사한 컨텐츠를 표시합니다 ( 이미지 , 텍스트 , 애플리케이션 위젯 ) </li></ul><ul><li>다른 Fragment 나 탭에 연결할 수 있습니다 </li></ul><ul><li>Activity 의 오버플로 메뉴 ( 동작 표시줄 ) 에 항목을 추가할 수 있습니다 </li></ul><ul><li>표시되지 않아도 됩니다 ( 은밀히 작동할 수 있음 ) </li></ul><ul><li>화면에 표시된다면 자체 레이아웃 파일이 있어야 합니다 </li></ul>( 기본 ) Fragment
    17. 17. Fragment(Activity 에 추가 ) XOOM_hc_app /res/layout/main.xml ( 목록 ) Fragment Activity 레이아웃 ( 컨텐츠 ) Fragment ( 이미지 임베딩 포함 )
    18. 18. 새로운 뷰 (View) <ul><li>애플리케이션 위젯 </li></ul><ul><ul><li>PopupMenu( android.widget.PopupMenu ) </li></ul></ul><ul><ul><ul><li>메뉴가 뷰 (View) 에 연결됩니다 ( 예 : 버튼 ) </li></ul></ul></ul><ul><li>홈 화면 위젯 </li></ul><ul><ul><li>StackView( android.widget.StackView ) </li></ul></ul><ul><ul><ul><li>3D 스택으로 하위 요소를 표시하고 사용자가 하위 요소 사이에서 각각 넘겨볼 수 있는 보기 화면 . </li></ul></ul></ul><ul><li>풍부한 알림 기능 ( ) </li></ul><ul><ul><li>알림 레이아웃을 구축합니다 </li></ul></ul>
    19. 19. 작업 예 <ul><li>SDK( 소프트웨어 개발 도구 ) 견본 중 Honeycomb Gallery 에 나와 있는 사항 </li></ul><ul><ul><li>인터페이스 탭 , 동작 항목 메뉴 및 오버플로 메뉴가 포함된 동작 표시줄 </li></ul></ul><ul><ul><li>Fragment List 및 Fragment 를 가로 및 세로 방향으로 표시 </li></ul></ul><ul><ul><li>새로운 테마 </li></ul></ul><ul><ul><li>끌어서 놓기 </li></ul></ul><ul><ul><li>애니메이션 </li></ul></ul><ul><ul><li>동작 표시줄 숨기기 / 표시 </li></ul></ul><ul><ul><li>소등 모드 </li></ul></ul>
    20. 20. 그래픽 및 멀티미디어 <ul><li>2D 그래픽을 위한 하드웨어 가속 </li></ul><ul><li>텍스처 압축 </li></ul><ul><li>새로운 애니메이션 프레임워크 </li></ul><ul><li>미디어 지원 </li></ul>프레젠테이션 제목 버전 1.0 2009 년 2 월 24 일
    21. 21. 하드웨어 가속 <ul><li>2D 그래픽 서브셋 상에서 가속을 위한 내장 지원 (Canvas API) </li></ul><ul><li>매니페스트에서 적절한 노드를 설정해 전체 애플리케이션 또는 각 Activity 에 적용 </li></ul><ul><ul><li>android:hardwareAccelerated=“true” </li></ul></ul><ul><li>다음을 통해 각 Activity 및 / 또는 창에 프로그래밍을 통해 로컬 적용 : WindowManager.LayoutParams </li></ul><ul><li> Window win = getWindow(); </li></ul><ul><li> win.setFlags </li></ul><ul><li> (WindowManager.LayoutParams. FLAG_HARDWARE_ACCELERATED, </li></ul><ul><li>WindowManager.LayoutParams. FLAG_HARDWARE_ACCELERATED ); </li></ul><ul><li>다음을 통해 캔버스에 하드웨어 가속이 적용되었는지 테스트해 확인 : isHardwareAcclerated() </li></ul>
    22. 22. 텍스처 압축 <ul><li>여러 종류의 칩셋은 여러 다른 종류의 압축 종류를 지원합니다 </li></ul><ul><li>모바일용 형식 : </li></ul><ul><ul><li>OpenGL ES 2.0 이 설치된 모든 Android 장치에서 ETC1 지원됨 ( 알파 채널은 지원되지 않음 ) </li></ul></ul><ul><ul><li>PVRTC(Imagination Technologies 의 PowerVR SGX 530 GPU) </li></ul></ul><ul><ul><li>ATITC(Qualcomm 의 Adreno GPU) </li></ul></ul><ul><ul><li>S3TC 또는 DXT1, 3, 5(nVidia GPU) </li></ul></ul><ul><li>솔루션 : 텍스처 압축 필터링 </li></ul><ul><ul><li><supports-gl-textures android:name=“string”> </li></ul></ul><ul><ul><li>문자열은 압축 종류에 해당하는 OpenGL ES 확장임 </li></ul></ul><ul><ul><li>예 : android:name=“GL_EXT_texture_compression_s3tc” </li></ul></ul>
    23. 23. 텍스처 압축 ( 계속 ) <ul><li>Honeycomb 에서뿐만 아니라 모든 API 레벨과도 작동됩니다 </li></ul><ul><li>지원되는 모든 형식을 위한 태그를 하나씩 정의해야 합니다 </li></ul><ul><li>Android Dev Guide - Android 매니페스트 태그에 나오는 지원되는 압축 종류 목록 </li></ul><ul><li>도구는 MotoDev 기술 자료 참조 </li></ul>
    24. 24. 애니메이션 <ul><li>다음과 같은 두 가지의 애니메이션 시스템을 선택할 수 있습니다 . </li></ul><ul><li>뷰 (View) 애니메이션 ( android.view.animation ) </li></ul><ul><ul><li>트윈 (Tween) 애니메이션 </li></ul></ul><ul><ul><ul><li>뷰 (View) 개체의 컨텐츠에서 간단한 일련의 변화를 실행합니다 . </li></ul></ul></ul><ul><ul><ul><li>기본 전환에는 그래픽의 회전 , 페이드 , 이동 및 늘이기가 포함됩니다 . </li></ul></ul></ul><ul><ul><li>프레임 (Frame) 애니메이션 </li></ul></ul><ul><ul><ul><li>프레임별 애니메이션으로 하나씩 Drawable 리소스를 연속으로 표시해 애니메이션을 만들 수 있습니다 . </li></ul></ul></ul><ul><li>프로퍼 티 (Property) 애니메이션 ( android.animation // Honeycomb 의 새로운 기능 ) </li></ul><ul><ul><li>(Drawable 과 같은 표시 뿐만 아니라 !) 거의 모든 개체를 애니메이션화할 수 있습니다 . </li></ul></ul><ul><ul><li>애니메이션화할 수 있는 프로퍼티 세트를 확장합니다 ( 그룹 및 재생 ) </li></ul></ul><ul><ul><li>뷰 (View) 애니메이션이 좀 더 간단하고 빠른 반면 , 프로퍼티 애니메이션은 기능이 더 많습니다 </li></ul></ul><ul><ul><li>참조 : </li></ul></ul>
    25. 25. 미디어 지원 - 장치에서 컨텐츠 얻기 <ul><li>디지털 미디어 파일 전송 </li></ul><ul><ul><li>미디어 / 사진 전송 프로토콜 (MTP/PTP) 을 위한 내장 지원 </li></ul></ul><ul><ul><li>사용자가 USB 케이블을 꼽으면 Android File Transfer 애플리케이션이 시작됩니다 . </li></ul></ul><ul><ul><li>사용자는 사진 , 영화 , 비디오 , 벨소리 , 팟캐스트 등을 미리 정의된 폴더에 복사하거나 다른 컨텐츠를 위한 새 폴더를 만들 수 있습니다 . </li></ul></ul>
    26. 26. 하드웨어 <ul><li>센서 </li></ul><ul><li>카메라 </li></ul><ul><li>터치 스크린 </li></ul><ul><li>전화 통신 </li></ul>
    27. 27. 센서 <ul><li>가속도계 , 자이로스코프 , 자기계 , 기압계 , 나침반 , 조도계 , GPS, 근접 센서 없음 , 진동 없음 </li></ul><ul><li>장치 방향 </li></ul><ul><ul><li>정상적인 방향은 4- 방향 회전에 가로 방향입니다 </li></ul></ul>-y e +y es +x -x +z +y e +y e -x +x -y e -y e +x -x 0 도 회전 0 도 회전 90 도 회전
    28. 28. 센서 ( 계속 ) <ul><li>android.view.Display.getRotation() 을 사용해 현재 방향을 알아냅니다 </li></ul><ul><li>네 가지 회전 방향 종류에 대한 x/y 값을 조정합니다 </li></ul><ul><ul><li>ROTATION_0 </li></ul></ul><ul><ul><li>ROTATION_90 </li></ul></ul><ul><ul><li>ROTATION_180 </li></ul></ul><ul><ul><li>ROTATION_270 </li></ul></ul><ul><li>SDK 에서 AccelerometerPlay 견본 참조 </li></ul><ul><li>Android 블로그 포스트 One Screen Turn Deserves Another 에 자세한 내용이 나와 있습니다 </li></ul><ul><li>애플리케이션이 회전하지 않도록 하려면 다음을 통해 정상적인 방향으로 고정하십시오 : </li></ul><ul><ul><ul><li><activity android:orientation=“nosensor” /> </li></ul></ul></ul>
    29. 29. 센서 - 기압계 센서 판독 버전 1.0 © 2010 Motorola Mobility, Inc. // // 고도 10 미터 상승시 ~ 1.2 gm /cm2 감소
    30. 30. 카메라 <ul><li>2 개의 카메라 ( 전방 및 후방 ) 를 사용할 수 있습니다 </li></ul><ul><ul><li>5 MP, 자동 초점 , 후방 </li></ul></ul><ul><ul><li>2 MP, 고정 초점 , 전방 </li></ul></ul><ul><li>Gingerbread(2.3) 에서 이중 카메라에 대한 지원 추가됨 </li></ul><ul><li>후방 카메라가 기본 카메라이므로 후방 카메라의 특징을 기반으로 필터링이 수행됩니다 ( 예 : ) </li></ul><ul><li><uses-permission android:name=“android.permission.CAMERA” /> </li></ul><ul><li><uses-feature android:name=“” </li></ul><ul><li> android:required=<true or false> /> </li></ul>
    31. 31. 카메라 ( 계속 ) <ul><li>import android.hardware.Camera; </li></ul><ul><li>import android.hardware.Camera.CameraInfo ; </li></ul><ul><li>  </li></ul><ul><li>[…] </li></ul><ul><li>  </li></ul><ul><li>public void toggleCamera() { </li></ul><ul><li>Camera mCamera; </li></ul><ul><li>int numberOfCameras = Camera. getNumberOfCameras() ; </li></ul><ul><li>CameraInfo cameraInfo = new CameraInfo(); </li></ul><ul><li>for (int i = 0; i < numberOfCameras; i++) { </li></ul><ul><li>Camera. getCameraInfo (i, cameraInfo); </li></ul><ul><li>if ( cameraInfo.facing == CameraInfo. CAMERA_FACING_FRONT ) { </li></ul><ul><li>mCamera =; </li></ul><ul><li> // 전방 카메라로 작업 수행 </li></ul><ul><li>  </li></ul><ul><li>} else if ( cameraInfo.facing == CameraInfo. CAMERA_FACING_BACK ) { </li></ul><ul><li>mCamera =; </li></ul><ul><li> // 후방 카메라로 작업 수행 </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    32. 32. 터치 스크린 <ul><li>android.hardware.touchscreen.multitouch (API 레벨 7) </li></ul><ul><ul><li>손가락 2 개로 누르는 작동을 지원합니다 </li></ul></ul><ul><li>android.hardware.touchscreen.distinct (API 레벨 8) </li></ul><ul><ul><li>2 개 이상의 손가락을 완전히 독립적으로 추적하는 작동을 지원합니다 </li></ul></ul><ul><li>android.hardware.touchscreen.multitouch.jazzhands (API 레벨 9) </li></ul><ul><ul><li>5 개 이상의 손가락을 완전히 독립적으로 추적하는 작동을 지원합니다 (10 개 손가락으로 누르기 ) </li></ul></ul><ul><ul><li><uses-feature> 태그를 설정해 이 기능을 지원하는 장치 ( 예 : XOOM) 로 필터링합니다 </li></ul></ul>
    33. 33. 터치 스크린 ( 계속 ) <ul><li>XOOM 에는 실제 키보드가 없기 때문에 사용자에게는 터치 스크린 표면이 기본적인 접촉 지점이 됩니다 </li></ul><ul><ul><li>터치라는 개념을 반드시 이해해야 합니다 </li></ul></ul><ul><li>MotionEvent 로 onTouch 이벤트 리스너 기능을 사용합니다 </li></ul><ul><ul><li>MotionEvent.getPointerCount(): 터치 지점의 수를 알려줌 </li></ul></ul><ul><ul><li>MotionEvent.getPointerId(): 각 손가락을 추적할 수 있게 함 </li></ul></ul><ul><li>Making Sense of Multitouch 에서 Adam Powell 의 블로그 게시물을 참조하십시오 </li></ul>
    34. 34. 전화 통신 <ul><li>장치 관점 </li></ul><ul><ul><li>CDMA, UMTS/GMS 장치에는 4G/LTE 네트워크를 지원하기 위한 무선 통신 장치가 있습니다 </li></ul></ul><ul><ul><li>전화 통신 프레임워크의 서브셋이 지원됩니다 ( android.telephony.TelephonyManager ) </li></ul></ul><ul><li>앱 관점 </li></ul><ul><ul><li>전화 기능이 지원되지 않습니다 </li></ul></ul><ul><ul><li><uses-feature android:name=“android.hardware.telephony </li></ul></ul><ul><ul><li>android:required=“true”/> </li></ul></ul><ul><li>XOOM 을 위한 여러 구성 </li></ul><ul><ul><li>CDMA, UMTS/GSM, WiFi 만 </li></ul></ul><ul><ul><li>TelephonyManager.getDeviceId() 정보가 동일하지 않음 </li></ul></ul><ul><ul><li>일반적으로 IMEI 또는 MIED 이 반환됨 : WiFi 장치는 Null 을 반환 </li></ul></ul>
    35. 35. 전화 통신 ( 계속 ) <ul><li>고유의 식별자 얻기 : 데이터를 구하는 이유가 무엇인지 생각해 봅시다 . 하드웨어를 추적하기 위함입니까 , 아니면 앱을 추적하기 위함입니까 ? </li></ul><ul><ul><li>하드웨어 추적 작업은 공장 리셋 전반에서 지속적으로 필요합니다 . </li></ul></ul><ul><ul><li>앱 추적 작업은 공장 리셋 시 값을 리셋해야 합니다 .  </li></ul></ul><ul><li>MAC 주소 ( 권장하지 않음 ) </li></ul><ul><ul><li>모든 장치에 WiFi 가 있는 것은 아닙니다 . 또한 WiFi 가 켜져 있지 않을 경우 하드웨어에서 MAC 주소를 보고하지 않을 수도 있습니다 . </li></ul></ul><ul><li>일련 번호 ( 권장하지 않음 ) </li></ul><ul><ul><li>전화 통신 기능이 없는 장치에서만 확실히 보장됩니다 . </li></ul></ul><ul><li>ANDROID_ID( 아마도 ) </li></ul><ul><ul><li>장치가 처음 부팅되면 생성되어 저장됩니다 . 장치를 지우면 리셋됩니다 . </li></ul></ul><ul><ul><li>Android 2.2 이전 버전의 장치에서는 확실히 보장되지 않습니다 </li></ul></ul><ul><li>새로운 권장 사항은 자체 고유 ID 를 생성해 선호하는 공유 파일에 저장하는 것입니다 </li></ul><ul><ul><li>예 : uniqueId = UUID.randomUUID.toString() </li></ul></ul>
    36. 36. 10 가지…… .. <ul><li>Honeycomb SDK </li></ul><ul><li>targetSdkVersion </li></ul><ul><li>레이아웃 </li></ul><ul><li>예외 처리 </li></ul><ul><li>호환 모드 </li></ul><ul><li>Drawable </li></ul><ul><li>텍스트 </li></ul><ul><li>허용 (Permission) 및 기능 </li></ul><ul><li>코드 베이스 유지 </li></ul><ul><li>Honeycomb SDK </li></ul>
    37. 37. 지금 당장 할 수 있는 10 가지 작업 <ul><li>Honeycomb SDK( 및 업데이트된 도구 ) 를 다운로드해 에뮬레이터에서 앱을 시험 가동해 봅니다 . </li></ul><ul><li>targetSdkVersion 을 “ 11 ” 로 변경하고 무엇이 바뀌는지 살펴봅니다 . </li></ul><ul><li>대형 화면에 최적화된 레이아웃을 갖춘 프로젝트에 /res/layout-xlarge 및 /res/layout-xlarge-port 폴더를 추가합니다 . </li></ul><ul><li>오류 처리를 업데이트해 앱이 일정 시간 무응답 상태가 되거나 (ANR) 사용자가 마냥 기다리게 하기보다는 부드럽게 종료되도록 합니다 . </li></ul><ul><li>앱이 “호환 모드”에서 실행되고 있는지 알아봅니다 . </li></ul><ul><ul><li>minSdkVersion= &quot; 3 &quot; , targetSdkVersion 없음 ; 1.5 대상으로 구축 </li></ul></ul><ul><ul><li>minSdkVersion= &quot; 3 &quot; 및 targetSdkVersion= &quot; 3 &quot; ; 1.5 를 초과한 모든 SDK 대상으로 구축 </li></ul></ul><ul><ul><li>“ 쉐도우박스 효과” </li></ul></ul>
    38. 38. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><ul><li>targetSdkVersion >= “4” 로 설정 , 1.6 이상의 SDK 대상으로 구축 </li></ul></ul>
    39. 39. <ul><li>/res/drawable-< density > 에서 그래픽을 다시 찾아봅니다 . </li></ul>지금 당장 할 수 있는 10 가지 작업 ( 계속 )
    40. 40. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><ul><li>9- 패치 도구를 사용하여 “늘일 수 있는” 영역을 만듭니다 </li></ul></ul><ul><ul><li>배경을 ImageView 로 놓고 scaleType=centerCrop 을 설정합니다 </li></ul></ul><ul><li><ImageView </li></ul><ul><li>android:src=“@drawable/background” </li></ul><ul><li>android:layout_width=“match_parent” </li></ul><ul><li>android:layout_height=“match_parent” </li></ul><ul><li>android:scaleType=“centerCrop” /> </li></ul>
    41. 41. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><li>패턴 이미지를 기울일 수 있습니다 </li></ul><ul><ul><li>/res/layout/main.xml </li></ul></ul><ul><ul><li><LinearLayout </li></ul></ul><ul><ul><li>android:background=“@drawable/background” </li></ul></ul><ul><ul><li>/res/layout/background.xml </li></ul></ul><ul><ul><li><bitmap </li></ul></ul><ul><ul><li>xmlns:android= </li></ul></ul><ul><ul><li>“” </li></ul></ul><ul><ul><li>android:src=“@drawable/baseimage” </li></ul></ul><ul><ul><li>android:tileMode=“repeat” </li></ul></ul><ul><ul><li>android:filter=“true” </li></ul></ul><ul><ul><li>android:dither=“true” /> </li></ul></ul>
    42. 42. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><li>DisplayMetrics 로부터의 얻는 치수를 사용하여 createScaledBitmap() 에 읽어 들입니다 </li></ul><ul><li>BitmapDrawable backgroundImage = </li></ul><ul><li> (BitmapDrawable)getResources().getDrawable (R.drawable.background); </li></ul><ul><li>Bitmap backgroundBitmap = backgroundImage.getBitmap(); </li></ul><ul><li>backgroundBitmap = Bitmap.createScaledBitmap </li></ul><ul><li>(backgroundBitmap, </li></ul><ul><li> dm.widthPixels ,      // 메트릭스 폭 표시 </li></ul><ul><li> dm.heightPixels ,     // 메트릭스 높이 표시 </li></ul><ul><li>  true);                 // 필터링 활성화 </li></ul>
    43. 43. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><li>텍스트가 알아볼 수 있는 상태이며 큰 화면에서 원활하게 표시되는지 확인합니다 . </li></ul><ul><ul><li>크기가 더 크다면 (1280 x 800) 텍스트를 최적화해 공간을 최대한 활용합니다 </li></ul></ul>
    44. 44. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><ul><li>2 개의 다른 글꼴 크기로 ( 모두 sp 단위 ) /res/values 및 /res-values-xlarge 에 2 개의 다른 <dimens> 태그를 생성합니다 </li></ul></ul><ul><ul><li>@dimen/< variable > 을 <style> textSize 속성에 추가합니다 </li></ul></ul><ul><ul><li><style name=“readText” parent=“@android:style/TextAppearance”> </li></ul></ul><ul><ul><li><item name=“android:textSize”> @dimen/font_size </item> </li></ul></ul><ul><ul><li><item name=“android:textColor”>#000000</item> </li></ul></ul><ul><ul><li></style> </li></ul></ul>
    45. 45. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><li>시장에서 앱을 걸러낼만한 허용 (Permission) 및 <uses-feature> 태그를 확인합니다 . </li></ul><ul><ul><li>허용 (Permission) 은 앱을 걸러내지는 않으나 <uses-feature> 태그는 걸러냅니다 . </li></ul></ul><ul><ul><li>XOOM 에는 전화 기능이 없는 것이나 ...... 마찬가지입니다 . </li></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ CALL_PHONE ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ CALL_PRIVILEGED ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ MODIFY_PHONE_STATE ” </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ PROCESS_OUTGOING_CALLS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ READ_SMS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ RECEIVE_SMS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ RECEIVE_MMS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ RECEIVE_WAP_PUSH ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ SEND_SMS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ WRITE_APN_SETTINGS ” /> </li></ul></ul></ul></ul><ul><ul><ul><ul><li><uses-permission android:name=“ WRITE_SMS ” /> </li></ul></ul></ul></ul><ul><ul><li> <uses-feature </li></ul></ul><ul><ul><li>android:name=“android.hardware.telephony” </li></ul></ul><ul><ul><li>android:required=“true”/> </li></ul></ul>* 내포 *
    46. 46. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><ul><li>XOOM 에서 앱이 보여지게 하려면 android:required=“ false ” 를 명시적으로 설정해야 합니다 </li></ul></ul><ul><ul><li>APK 에서 aapt 도구를 실행해 명시적 기능을 표시합니다 </li></ul></ul><ul><ul><ul><li>$ aapt dump badging < path_to_exported_.apk > </li></ul></ul></ul><ul><ul><li>$ ./aapt dump badging BTExample.apk package: name='' versionCode='' versionName='' uses-permission:'android.permission.BLUETOOTH_ADMIN' uses-feature:'android.hardware.bluetooth' sdkVersion:'3' targetSdkVersion:'5’ <. . .> </li></ul></ul><ul><ul><li>MOTODEV App Validator 를 실행해 암시적 기능을 표시합니다 . </li></ul></ul><ul><ul><ul><li> </li></ul></ul></ul>
    47. 47. 지금 당장 할 수 있는 10 가지 작업 ( 계속 ) <ul><li>코드 베이스를 어떻게 관리할 것인지 결정합니다 . 공식적인 추천 사항은 단일 2 진수 접근식을 유지하는 것입니다 . 호환 라이브러리를 통해 Fragment 를 1.6 까지 사용할 수 있음을 명심하십시오 . </li></ul><ul><li>Honeycomb SDK( 및 업데이트된 도구 ) 를 다운로드해 에뮬레이터에서 앱을 시험 가동해 봅니다 . </li></ul>
    48. 48. Android 3.1 API 레벨 12 <ul><li>크기 조정 가능한 위젯 </li></ul><ul><li>입력 및 모션 </li></ul><ul><li>USB API </li></ul><ul><li>MTP/PTP 지원 </li></ul><ul><li>실시간 전송 프로토콜 (RTP) </li></ul><ul><li>Fragment Breadcrumb </li></ul>
    49. 49. 크기 조정 가능한 위젯 <ul><li>홈 화면의 위젯은 크기가 조정 가능합니다 </li></ul><ul><ul><li>가로 , 세로 또는 양 방향 모두 </li></ul></ul><ul><li>위젯 AppWidgetProviderInfo 메타 데이터에서 resizemode 특성을 정의합니다 </li></ul><ul><li><appwidget-provider xmlns:android=&quot; res/android&quot;   android:minWidth=&quot;294dp&quot;   android:minHeight=&quot;72dp&quot;   android:updatePeriodMillis=&quot;86400000&quot;   android:previewImage=&quot;@drawable/preview&quot;   android:initialLayout=&quot;@layout/example_appwidget&quot; </li></ul><ul><li>android:configure=&quot;;   android:resizeMode=&quot;horizontal|vertical&quot; > </appwidget-provider> </li></ul>
    50. 50. 입력 종류 및 모션 이벤트 <ul><li>모든 보기와 창에 걸쳐 다양한 새로운 입력원과 모션 이벤트를 지원하기 위해 입력 이벤트 시스템이 확장되었습니다 </li></ul><ul><li>마우스와 트랙볼 입력의 경우 플랫폼이 새로운 두 가지 모션 이벤트를 지원합니다 </li></ul><ul><ul><li>ACTION_SCROLL ( 가로 또는 세로 ): 스크롤휠과 같은 장치에서 스크롤 모션이 발생한 포인터의 위치를 제공합니다 </li></ul></ul><ul><ul><li>ACTION_HOVER_MOVE : 버튼을 누르지 않은 상태인 마우스의 위치를 보고합니다 </li></ul></ul><ul><li>조이스틱 , 게임패드 , 마우스 및 트랙볼의 모션 이벤트는 터치 이벤트가 아닙니다 </li></ul><ul><ul><li>onTouchEvent() 와 달리 onGenericMotionEvent() 로의 호출을 통해 모션 이벤트를 “일반적” (Generic) 모션 이벤트로 뷰 (View) 에 전달하기 위한 새로운 콜백 방법 </li></ul></ul>
    51. 51. USB API <ul><li>USB 호스트 모드를 위한 내장 플랫폼 지원으로 애플리케이션이 연결된 주변 장치를 관리할 수 있도록 해주는 API 를 노출시킵니다 </li></ul><ul><ul><li>호스트 모드는 Android 작동 장치에서 적절한 USB 컨트롤러 하드웨어에 의존합니다 </li></ul></ul><ul><ul><li>XOOM 과 같이 호스트 모드를 지원하는 장치에서는 애플리케이션이 API 를 이용해 연결된 장치를 식별하고 장치와 통신할 수 있습니다 . </li></ul></ul><ul><li>또한 두 가지의 기본 연결 하드웨어를 지원합니다 (Android 장치가 호스트로 작동하는지 여부에 따라 다름 ) </li></ul><ul><ul><li>USB 장치 : 호스트 역할을 하기 위해 Android 작동 장치에 의존하는 연결된 하드웨어 ( 카메라 , 키보드 , 마우스 ) </li></ul></ul><ul><ul><li>USB 액세서리 : USB 호스트 컨트롤러가 있는 연결된 하드웨어 ( 로보틱스 ) </li></ul></ul><ul><li>USB API 를 이용할 수 있는 패키지 : android.hardware.usb </li></ul>
    52. 52. MTP/PTP 지원 <ul><li>새로운 패키지 android.mtp </li></ul><ul><ul><li>클래스 MtpDevice, MtpDeviceInfo, MtpConstants </li></ul></ul><ul><li>연결된 카메라 및 USB 호스트 버스 상에 연결되어 있는 다른 PTP( 사진 전송 프로토콜 ) 장치와 애플리케이션이 API 를 통해 직접 상호 작용할 수 있습니다 </li></ul><ul><ul><li>부착된 UsbDevice 를 언급하여 MtpDevice 개체를 예를 들어 설명합니다 </li></ul></ul><ul><ul><li>연결을 개방하고 데이터를 전송합니다 </li></ul></ul><ul><ul><li>장치와 장치에 저장된 개체에 대한 정보를 얻습니다 </li></ul></ul><ul><ul><li>장치를 부착하고 분리할 때 알림을 수신합니다 </li></ul></ul><ul><li>이제 Gallery 앱이 PTP 를 지원하므로 사용자는 USB 를 통해 카메라를 연결하고 한 번만의 간단한 작동으로 사진을 Gallery 로 가져올 수 있습니다 </li></ul>
    53. 53. 시연
    54. 54. 자세한 내용 : <ul><li>도구 </li></ul><ul><ul><li>MOTODEV Studio: 추가적 기능 ( 문자열 로컬화 , 데이터베이스 관리자 ) 이 있는 이클립스 기반의 IDE </li></ul></ul><ul><ul><li>App Validator: Android 앱의 장치 간 호환성을 사전에 검사하기 위한 온라인 도구 </li></ul></ul><ul><li>기술 자료 </li></ul><ul><ul><li>Motorola XOOM Programming Tips(Motorola XOOM 프로그래밍 팁 ) </li></ul></ul><ul><ul><li>Understanding Texture Compression( 텍스처 압축에 대한 이해 ) </li></ul></ul><ul><li>제품 사양 </li></ul><ul><ul><li> </li></ul></ul><ul><li>토론 게시판 </li></ul>
    55. 55. 질문 © 2010 Motorola Mobility, Inc. 56
    56. 56. 감사합니다 ! © 2010 Motorola Mobility, Inc. 57
    57. 57. 법적 고지 <ul><li>라이센스 주의 사항 </li></ul><ul><li>따로 기재된 사항이 없다면 Motorola Mobility Inc. 가 기술하고 제공하는 견본 소스 코드는 아래 설명과 같이 사용이 허가됩니다 . </li></ul><ul><li>Copyright © 2010-2011, Motorola, Inc. All rights reserved( 달리 명시적으로 표시한 것은 예외 ). </li></ul><ul><li>수정 유무를 막론하고 소스 및 2 진수 형태로의 재배포 및 사용은 다음 조건이 충족될 경우에만 허용됩니다 . </li></ul><ul><li>소스 코드의 재배포는 위의 저작권 주의 사항 , 이 조건 목록 및 다음의 부인 고지 사항을 유지해야 합니다 . </li></ul><ul><li>2 진수 형태로의 재배포는 위의 저작권 주의 사항 , 이 조건 목록 및 다음의 부인 고지 사항을 배포물과 함께 제공되는 문서 및 / 또는 기타 자료에 복제해야 합니다 . </li></ul><ul><li>구체적인 사전 서면 허가가 없이는 이 소프트웨어에서 파생된 제품을 보증하고 홍보하는 데 Motorola, Inc. 이름 및 해당 기여자의 이름을 사용할 수 없습니다 . </li></ul><ul><li>이 소프트웨어는 저작권 소유자와 기여자에 의해 &quot; 있는 그대로 &quot; 제공되며 모든 명시적 또는 묵시적 보증 ( 상품성 및 특정 목적에 대한 적합성에 대한 묵시적 보증을 포함하며 여기에 제한되지 않음 ) 을 배제합니다 . 저작권 소유자 또는 기여자는 이 소프트웨어의 사용으로 인해 발생하는 모든 직접적 , 간접적 , 부수적 , 예외적 , 전형적 또는 결과적 손해 ( 대체품이나 대체 서비스의 조달 , 사용 , 데이터 또는 이익 손실 , 또는 영업 중단을 포함하되 이에 제한되지 않음 ) 에 대하여 계약에 의한 것이든 , 엄밀한 책임 또는 불법 행위 ( 또는 과실과 기타 행위를 포함하여 ) 에 의한 것이든 이와 여타 책임 소재에 상관없이 어떠한 경우에도 책임을 지지 않으며 , 이는 그와 같은 손해의 가능성을 사전에 알고 있던 경우에도 마찬가지입니다 </li></ul><ul><li>  이 프레젠테이션에서 표시되는 기타 소스 코드는 다른 라이센스 하에 제공될 수도 있습니다 . 
 </li></ul><ul><li>Apache 2.0 </li></ul><ul><li>Copyright © 2010, Android Open Source Project. All rights reserved( 달리 명시적으로 표시한 것은 예외 ). </li></ul><ul><li>Apache 라이센스 하에서 사용이 허가됨 , 버전 2.0(&quot; 라이센스 &quot;); 이 라이센스를 준수하지 않고는 이 파일을 사용할 수 없습니다 . 에서 라이센스 사본을 얻을 수 있습니다 . </li></ul><ul><li>해당 법률에 의해 필요하거나 서면 동의가 있지 않는 한 이 라이센스 하에서 배포되는 소프트웨어는 명시적이든 묵시적이든 막론하고 어떠한 보증이나 조건 없이 &quot; 있는 그대로 &quot; 배포됩니다 . 이 라이센스 하의 특정 언어 관리 허가 및 제한 사항은 라이센스를 참조하십시오 . </li></ul><ul><li>Creative Commons 3.0 귀속 라이센스 </li></ul><ul><li>이 프레젠테이션의 일부는 Google 이 생성하고 공유하는 작업에서 복제된 것이며 ( Creative Commons 3.0 귀속 라이센스 ( 에 설명된 약관에 따라 사용되었습니다 . </li></ul>