函館ika ics開発情報

61
ICS開発情報 @vvakame Saturday, March 24, 12

Upload: masahiro-wakame

Post on 06-May-2015

3.023 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: 函館IKA ICS開発情報

ICS開発情報

@vvakame

Saturday, March 24, 12

Page 2: 函館IKA ICS開発情報

Honeycomb• Fragment

• Action Bar

• Loader

• Gamepad, Joypad

• USB Host

• ADK (Android Open Accessory Development Kit)

世間がスルーwSaturday, March 24, 12

Page 3: 函館IKA ICS開発情報

Ice Cream Sandwich

• Action Provider

• Android Beam

• Wi-Fi Direct

Saturday, March 24, 12

Page 4: 函館IKA ICS開発情報

Compatibility Package• 一部、新APIの互換パッケージ有り

• Android 1.6(Donuts) 以降に対応• 以下のAPIが使えるよ!

• 各種 Fragment• 各種 Loader• 各種 Adapter• MenuCompat

Action Bar はありません。ActionBarSherlock というのがあります。

Saturday, March 24, 12

Page 6: 函館IKA ICS開発情報

Fragment

• Android開発の新しい基本要素

• ライフサイクルイベントを持つ

• 部品化されたActivity

• ライブラリ化がしやすい

必修科目!!!

Saturday, March 24, 12

Page 7: 函館IKA ICS開発情報

構成の変化

Activity

View

View

View

今までの作り方

View

View

Saturday, March 24, 12

Page 8: 函館IKA ICS開発情報

構成の変化

Activity

View無しFragment

View有りFragmentView

View

View

これからの作り方

Saturday, March 24, 12

Page 9: 函館IKA ICS開発情報

構成の変化• ロジックを書く場所

• 今まではActivityに書いたり

• これからはFragmentに書く!

• ActivityはFragmentの交差点に

• Fragmentは小型Activity的な役割

Saturday, March 24, 12

Page 10: 函館IKA ICS開発情報

使い方 (View有り)

• スマホ・タブレット対応に便利

• 1Fragmentだけ表示=スマホ用

• 複数Frament表示=タブレット用

• ↑スマホで複数Fragmentもあり

Saturday, March 24, 12

Page 11: 函館IKA ICS開発情報

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

<fragment android:id="@+id/fragment" android:name="net.vvakame.hakodateika.SampleFragment" android:layout_width="match_parent" android:layout_height="wrap_content" />

</LinearLayout>

使い方 (View有り)

こんだけ

Saturday, March 24, 12

Page 12: 函館IKA ICS開発情報

使い方 (View有り)

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/this_is_fragment" />

</LinearLayout>

public class SampleFragment extends Fragment {

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container); }}

Saturday, March 24, 12

Page 13: 函館IKA ICS開発情報

使い方 (View無し)

• ロジックのライブラリ化に便利

• ライフサイクルイベントあるからね!

• プログラムからFragmentを追加してやる

• onCreateView で null を返すとエラー

Saturday, March 24, 12

Page 14: 函館IKA ICS開発情報

使い方 (View無し)

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }}

compat 利用時はFragmentActgivityを継承

Saturday, March 24, 12

Page 15: 函館IKA ICS開発情報

使い方 (View無し)

• ライブラリ化の例

• Android Beamの簡単ライブラリ化

• Activityに2つのinterfaceを実装

• AndroidManifestに少し書き足す

• ↑これだけで簡単に利用可能!!実際のコードを見てみます

Saturday, March 24, 12

Page 16: 函館IKA ICS開発情報

Fragmentの差し替え

• 画面遷移を表現することも可能

• FragmentManager とか

• FragmentTransaction とか

Saturday, March 24, 12

Page 17: 函館IKA ICS開発情報

addToBackStackpublic class MainActivity extends Activity implements OnClickListener { int mCount = 1;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // 初回は addToBackStackなし SampleFragment fragment = new SampleFragment("No." + mCount); FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.fragment_place, fragment).commit(); mCount++; } }

@Override public void onClick(View v) { SampleFragment fragment = new SampleFragment("No." + mCount); FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.fragment_place, fragment).addToBackStack(null).commit(); mCount++; }} Backキーで1つ前のFragmentに戻れる!

Saturday, March 24, 12

Page 18: 函館IKA ICS開発情報

おすすめイディオム• onAttach で独自コールバックを取得

public class SampleFragment extends Fragment { public interface OnSampleCallback { public void onXxx(); }

public interface OnSampleCallbackPicker { public OnSampleCallback getOnSampleCallback(); }

OnSampleCallback mCallback;

@Override public void onAttach(Activity activity) { super.onAttach(activity);

if (activity instanceof OnSampleCallbackPicker == false) { throw new ClassCastException( "activity が OnSampleCallbackPicker を実装していません."); } mCallback = ((OnSampleCallbackPicker) activity).getOnSampleCallback(); if (mCallback == null) { throw new NullPointerException("activityからcallbackが取得できませんでした"); } }}

Saturday, March 24, 12

Page 19: 函館IKA ICS開発情報

おすすめイディオム• Activity で独自コールバックを実装

public class MainActivity extends Activity implements OnSampleCallbackPicker { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }

public OnSampleCallback getOnSampleCallback() { return new OnSampleCallbackImpl(); }

class OnSampleCallbackImpl implements OnSampleCallback {

public void onXxx() { } }}

複数Fragment利用時に名前の衝突が少ない

Saturday, March 24, 12

Page 20: 函館IKA ICS開発情報

おすすめイディオム• ActivityでコードからFragmentを差し替える場合public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(new OnSampleCallbackImpl()); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }

class OnSampleCallbackImpl implements OnSampleCallback {

public void onXxx() { } }}

Fragmentの使い回しがよりやりやすく

Saturday, March 24, 12

Page 21: 函館IKA ICS開発情報

onDestroy

FragmentのライフサイクルActivity FragmentonCreate

onStart

onResume

onPause

onStop

onDestroy

onAttachonCreate

onCreateView

onActivityCreated

onStart

onResume

onPause

onStop

onDestroyViewonDetach

Saturday, March 24, 12

Page 22: 函館IKA ICS開発情報

onDestroyonDestroyView

onDetach

よく使うやつActivity FragmentonCreate

onStart

onResume

onPause

onStop

onDestroy

onAttachonCreate

onCreateView

onActivityCreated

onStart

onResume

onPause

onStop

Saturday, March 24, 12

Page 24: 函館IKA ICS開発情報

これ

Saturday, March 24, 12

Page 25: 函館IKA ICS開発情報

Action Bar

• 今まではMenuキー(ハードキー)だった

• 機能があるか押すまでわからん…

• じゃ、画面上に出せばよくね?

• ↑たぶんGoogleはこう思った

Saturday, March 24, 12

Page 26: 函館IKA ICS開発情報

使い方

• AndroidManifest.xml で…

• targetSdkVersion を 11以上

• minSdkVersion を 11以上

• ↑どっちか!

Saturday, March 24, 12

Page 27: 函館IKA ICS開発情報

ActionBarにできること• 今までのMenuと同じこと

• Viewを配置したりできる

• SplitActionBarで画面下に表示することもできる

Saturday, March 24, 12

Page 29: 函館IKA ICS開発情報

Loader

• AsyncTask のお利口さんVersion

• AsyncTaskLoader

• CursorLoader

• 処理結果をキャッシュしてくれる

Saturday, March 24, 12

Page 30: 函館IKA ICS開発情報

vs AsyncTask?• Loaderがよさそう

• データ更新通知が受け取れるもの

• AsyncTask がよさそう

• 頻繁に更新されるもの

• キャッシュの意味が薄いもの

• 毎回実行されないと困るものAsyncTask がいらなくなるわけじゃなさそうです

Saturday, March 24, 12

Page 32: 函館IKA ICS開発情報

ゲーム用HID対応大幅強化

全部Joystick扱いGamepadは...?

Saturday, March 24, 12

Page 33: 函館IKA ICS開発情報

リッチなゲームも作れる

USB接続のKeyboardやMouseもサポートされたので幅がさらに↑↑

• ActivityにGenericMotionEvent が追加

• on~ とか dispatch~ とか

• ボタン系は従来通りKeyEvent

• アナログ系はGenericMotionEvent

• 一定期間の入力が一気に渡されるのでMotionEvent#getHistoricalXXX 使う

Saturday, March 24, 12

Page 34: 函館IKA ICS開発情報

キーコンフィグだけ対応でもおk

既存のゲームも操作性大幅↑↑

Saturday, March 24, 12

Page 35: 函館IKA ICS開発情報

USB Host

もうすこし詳しい説明あります

3.1

ADK とは違うのだよ!

Saturday, March 24, 12

Page 36: 函館IKA ICS開発情報

USB Host?

プロトコルが分かればなんでも出来る…!?デバイスメーカーさん、対応Androidアプリ開発いかがですか!

• 今までのAndroidはDevice側だった

• マスストレージ とか

• 今度のAndroidはHost側になれます!

• ラベルプリンタを接続して印刷

• LEDディスプレーに図形表示 他

Saturday, March 24, 12

Page 37: 函館IKA ICS開発情報

実際にやってみた

タカラトミー グリッターパネルhttp://amzn.to/glitterpanel

Saturday, March 24, 12

Page 38: 函館IKA ICS開発情報

ADK3.1

Saturday, March 24, 12

Page 39: 函館IKA ICS開発情報

ADK?

@magoroku15 先生の資料がスゴい!

• Androidはデバイス側

• ADKがホスト側 …なんか直感と逆!

• Android 周辺機器が作れる

• 2.3.4 以降対応のBackport有り

RT社のADKボード

アプリ連携も容易!ハード対応アプリがなければマーケットに飛ばしたりも可能

Saturday, March 24, 12

Page 41: 函館IKA ICS開発情報

ActionProvider

• ActionBar用の動作のライブラリ化

• 公式だと ShareActionProvider

• 正直他にどう使えばいいのやら…?

• 良い活用方法が思いついたら教えて!

Saturday, March 24, 12

Page 42: 函館IKA ICS開発情報

使い方

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/pick_action_provider" android:actionProviderClass="net.vvakame.applist.ApplicationActionProvider" android:icon="@android:drawable/ic_menu_send" android:showAsAction="always"/>

</menu>

ActionBar 実装クラスを指定します

Saturday, March 24, 12

Page 44: 函館IKA ICS開発情報

Android Beam• NFC 

• 端末タッチで簡単に通信可能

• でも転送速度は遅い 1KBが目安

• 端末間通信のための便利なAPI

• かっこいいUI!

• 送信先アプリ指定も可能!

Saturday, March 24, 12

Page 45: 函館IKA ICS開発情報

NFC?• Near Field Communication の略

• FeliCa とか Kitaca, Suica みたいな奴

• 実は 2.3 時代からNFCのAPIはあった

• 2.3.4 から書込/送信も可能に

• Beam は OSとして使い方を示した!

Saturday, March 24, 12

Page 46: 函館IKA ICS開発情報

Android Beam?

• 主に端末 ←→ 端末の情報交換

• Youtubeアプリで見てる動画の共有

• 起動中アプリを相手側で起動

• 送信先アプリの指定が可能 (AAR)アプリにBeam用実装がない場合、受信側で同じアプリを起動します。なかったらマーケットへ飛びます。

Saturday, March 24, 12

Page 47: 函館IKA ICS開発情報

使い方

• AndroidManifest.xmlに書く

• NfcAdapter経由でコールバックを登録

• NDEF を送って送受信する

実際のコードを見てみます

Saturday, March 24, 12

Page 48: 函館IKA ICS開発情報

NDEFって何?

• NFC Data Exchange Format の略

• NFCによるデータ交換はこの形式

• Beamするだけならテンプレコードでおk

• 別に覚えなくても問題なし!

Saturday, March 24, 12

Page 49: 函館IKA ICS開発情報

android.nfc.NdefMessage

NdefRecord NdefRecord

NdefMessage

• NdefMessageは1つ以上のNdefRecordから構成される

• 一般的には1レコードだけっぽい

Saturday, March 24, 12

Page 50: 函館IKA ICS開発情報

android.nfc.NdefRecord

NdefRecord NdefRecord

NdefMessage

MB ME CF SR IL TNF

LENGTH INFO(TYPE, PAYLOAD, ID)

BODY(TYPE, ID, PAYLOAD)Saturday, March 24, 12

Page 51: 函館IKA ICS開発情報

どう解釈するの?

• TNFとTypeの値によってPayloadの解釈の仕方が変わる

• AndroidSDKに含まれるNFCDemoではText, Uri, SmartPosterに対応

• NFC RTD でぐぐれ

Saturday, March 24, 12

Page 52: 函館IKA ICS開発情報

略語• NFC Near Field Communication• NDEF NFC Data Exchange Format• MB Message Begin• ME Message End• CF Chunk Flag• SR Short Record• IL ID Length• TNF Type Name Format• RTD Record Type Definition

Saturday, March 24, 12

Page 53: 函館IKA ICS開発情報

Wi-FI Direct4.0

日経ソフトウェア5月号今日発売!

Saturday, March 24, 12

Page 54: 函館IKA ICS開発情報

Wi-Fi Direct• 端末同士でWi-Fiで通信できる

• 通信速度が早い

• セキュア (WPA2, WPS)

• 接続も比較的簡単…

• フレームワークの品質が悪い!!!!

• 2.3時代のNFCのAPIを見ているよう…

Saturday, March 24, 12

Page 55: 函館IKA ICS開発情報

Wi-Fi Direct (仕様)• 機器同士で通信が可能

• APの助けとかはいらない

• Ad hoc とは違う (通常の接続と両立)

• Androidでは今のところ両立不可

• プリンタに直接接続して印刷とか

• 今のとこOSは手伝ってくれない

Saturday, March 24, 12

Page 56: 函館IKA ICS開発情報

Frameworkェ…!• OS巻き込んで落ちる

• 切断→再接続 を3セットくらいで落ちる

• 原稿書いてる途中10分に1回リブる

• OS設定画面のON/OFFイジっただけで落ちる

• 使い物になるかァ!ヽ(`!´)ノ

Saturday, March 24, 12

Page 57: 函館IKA ICS開発情報

(´・ω・`)

まだ製品品質じゃないね…

こなれるのまとうか…

今後の進化は超楽しみです!端末間通信は全部コレになるといいかも

Saturday, March 24, 12

Page 58: 函館IKA ICS開発情報

接続の流れアプリの呼び出し処理OSからの通知ユーザにさせる操作

0. Wi-Fi Directを有効にする (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION がBroadcastされる)

1. WifiP2pManager#discoverPeers で接続可能なPeerを探す2. WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION がBroadcastされてくる3. WifiP2pManager#requestPeers で各Peerの情報をリクエストする4. WifiP2pManager.PeerListListener#onPeersAvailable にコールバックが来る5. 接続の前準備として、WifiP2pConfig を組み立てる WPSの指定など6. WifiP2pManager#connect で指定したPeerに接続する7. WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION がBroadcastされてくる8. WifiP2pManager#requestConnectionInfo で接続情報をリクエストする9. WifiP2pManager.ConnectionInfoListener#onConnectionInfoAvailable にコールバックが来る10. 通信のための処理を行う(Socketを開き通信を行うなど)

11. WifiP2pManager#removeGroup を呼び出し接続を解除する

Saturday, March 24, 12

Page 59: 函館IKA ICS開発情報

必要な権限

<?xml version="1.0" encoding="utf-8"?><manifest 略> <uses-sdk android:minSdkVersion="14" /> <!-- Wi-Fi Direct 接続確立 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- 通信のためのソケットを開くまで --> <uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.wifi.direct" />

略</manifest>

Saturday, March 24, 12

Page 60: 函館IKA ICS開発情報

おすすめ書籍

私が書きました

• 第1章 Android 4.0(ICS)

• 第2章 フラグメント

• 第3章 アクションバー

• 第4章 ノーティフィケーション

• 第5章 アニメーション

• 第6章 アプリケーションウィジェット

• 第7章 コピー&ペースト

• 第8章 ドラッグ&ドロップ

• 第9章 ローダー

yanzmSaturday, March 24, 12

Page 61: 函館IKA ICS開発情報

気になること?

Fragment

Action Bar

Loader

Gamepad, Joypad

USB Host

ADK

Action Provider

Android

Wi-Fi Direct

Saturday, March 24, 12