It’s now or never

IT系の技術ブログです。気になったこと、勉強したことを備忘録的にまとめて行きます。

初めてのRuby On Rails③ (メールを送る)

Railsには、メールを送信するための仕組みとしてActionMailerという機能があります。
今回は、ActionMailerを使用して、Gmailのメール送信を試してみます。

1.環境設定

設定ファイルにGmailの設定を記入します。

config/environments/development.rb

  config.action_mailer.default_url_options = { :host => "localhost", :port => 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => 'example.com',
    :user_name => "[ユーザー名]",
    :password => "[Gmailのパスワード]",
    :authentication => 'plain',
    :enable_starttls_auto => true,
  }

2.ActionMailerクラスを作成

ActionMailerクラスを生成するには、以下のコマンドを使用します。

rails generate mailer [Mialerクラス名] [アクション名]

例えば、messageというクラスにtestアクションを定義した場合は、
次のようにコマンドを実行します。

rails generate mailer message test

自動的に以下のファイルが生成されます。

create  app/mailers/message.rb
invoke  erb
create    app/views/message
create    app/views/message/test.text.erb
create    app/views/message/test.html.erb
invoke  test_unit
create    test/mailers/message_test.rb
create    test/mailers/previews/message_preview.rb

ActionMailerクラスは、app/mailers/配下に作成されています。

app/mailers/message.rb

class Message < ActionMailer::Base
  # デフォルトの送信もとアドレス
  default from: "[送信もとアドレス]"

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.message.hellp.subject
  #
  def hellp
    @greeting = "Hi"

    mail to: "[送信先アドレス]"
  end
end

送信されるメッセージの本文は、
app/views/message/test.html.erbに定義します。

<h1>Message#test</h1>

<p>
  <%= @greeting %>, find me in app/views/message/test.html.erb
</p>

3. 送信確認

railsのコンソールからメールを送信してみます。

rails console

Message.test.deliver

app/mailers/message.rbに定義した、
送信先のメールアドレスにメールが送信されていれば、正常に動作しています。

初めてのRuby On Rails② (scaffoldジェネレータ)

Rubyには、コードを自動生成するジェネレータが用意されています。
今回は、データベースのCRUD
データの作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)
の処理をを自動的に作成してくれる scaffoldジェネレータを使ってみました。

1.railsプロジェクトの作成

今回は、サンプルとして「bookshelf」というプロジェクトを作成します。

rails new bookshelf

2.scaffoldコマンドの実行

scaffoldジェネレータは、rails generateから始まるコマンドを使用します。

rails generate scaffold [モデル名] ([カラム名]:[データ型]…)

引数としてモデル名を渡して実行しますが、
ここでオプションとしてカラムを追加することも可能です。

カラムは、[カラム名]:[データ型] の書式で記載します。

今回は、「name」(string)と「description」(text)というカラムを持った「Book」というモデルを作成してみます。

rails generate scaffold Book name:string description:text

以下のように、
関連するモデル、ビュー、コントローラ、テストなどが、自動で生成されます。

invoke  active_record
      create    db/migrate/20140603151844_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml
      invoke  resource_route
       route    resources :books
      invoke  scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    erb
      create      app/views/books
      create      app/views/books/index.html.erb
      create      app/views/books/edit.html.erb
      create      app/views/books/show.html.erb
      create      app/views/books/new.html.erb
      create      app/views/books/_form.html.erb
      invoke    test_unit
      create      test/controllers/books_controller_test.rb
      invoke    helper
      create      app/helpers/books_helper.rb
      invoke      test_unit
      create        test/helpers/books_helper_test.rb
      invoke    jbuilder
      create      app/views/books/index.json.jbuilder
      create      app/views/books/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/books.js.coffee
      invoke    scss
      create      app/assets/stylesheets/books.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss


まずは、確認のためにhttp://127.0.0.1:3000/booksへ接続してみます。

f:id:inon29:20140604214335p:plain

ActiveRecord::PendingMigrationErrorというエラーが表示されました。

これは、rails generate scaffoldコマンドによってプロジェクトの関連ファイルは生成されましたが、
実際のDBのテーブルは、生成されていないため発生するエラーです。

railsがデフォルトで生成されるsqliteDBのファイルを確認しても、テーブルが作成されていないことがわかります。

(dbファイルの場所)

[puroject_path]/db/development.sqlite3

3.DBへマイグレーションファイルを適用する

DBへテーブル情報を反映されるためには、
scaffoldコマンドは、が自動で作成してくれる「マイグレーションファイル」を使います。
マイグレーションファイル」は、モデルの変更内容をDBへと反映する為の情報が記載されているファイルです。

(マイグレーションファイルの場所)

[puroject_path]/db/migrate/[マイグレーションファイル]

今回は、bookというモデルを作成したので、

[puroject_path]/db/migrate/20140603151844_create_books.rb

というファイルが作成されています。

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

ファイルの中身を見てみるとrails generate scaffoldコマンドで指定したテーブルの、
createメソッドが記述されています。

railsでは、モデル名に対して複数型の名称のDBテーブル名をつけるルールになっているため
 テーブル名はbooksとなっています。

この、マイグレーションファイルをDBへ反映されるためには、
以下のコマンドを実行します。

rake db:migrate

先ほど確認したsqliteDBファイルを再度確認すると
booksというテーブルができていることが確認できます。

sqlite> .tables
books              schema_migrations
sqlite>

もう一度http://127.0.0.1:3000/booksへ接続し表示を確認すると、
エラーが消え以下のような画面が表示されます。

f:id:inon29:20140604214403p:plain

画面から、New Bookのリンクをクリックすると以下のような画面へ遷移し、
booksテーブルにレコードを追加することができます。

f:id:inon29:20140604215853p:plain

その他、レコードの編集など、
基本的なデータ操作をscaffoldジェネレータを使うだけで簡単に実装することが可能です。

初めてのRuby On Rails①(環境構築)

Webアプリケーション作成のためのフレームワークであるRuby On Railsの勉強を始めました。
まずは、ローカルでRailsが動く環境を作ってみたいと思います。

Rubyの準備

1.rbenvのインストール

ローカルでの開発環境なので、色々と柔軟に作りたいと思い、
Rubyのバージョン管理ツールrbenvを使ってRubyをインストールしてみました。

brew install rbenv

インストールが完了したらrbenvの初期設定を行います。
以下の設定を.zshenv.bashrcに記載します。

この設定で、[user_home]/.rbenvディレクトリ配下に各バージョンごとのRubyがインストールされるようになります。

# rbenvの初期設定
if which rbenv > /dev/null; then
        export RBENV_ROOT=${HOME}/.rbenv
        export PATH=${RBENV_ROOT}/shims:${PATH}
        eval "$(rbenv init -)";
fi

その他、必要なツールのインストールを行います。

brew install ruby-build
brew install rbenv-gemset
brew install rbenv-gem-rehash

2.インストールの確認

ここまでで、正しくrbenvのインストールおよび設定ができているかを確認するために以下のコマンドを実行します。

rbenv versions

rbenv versionsコマンドは、インストール済みのRubyのバージョンを確認するコマンドです。

設定されているパスが以下のように自分のホームディレクトリを指していれば、正しく設定ができています。

* system (set by /Users/[user_home]/.rbenv/version)

3.rubyのインストール

実際にバージョンごとのRubyをインストールします。

インストール可能なバージョンの確認

rbenv install -l

目的のRubyのバージョンをインストール

rbenv install 2.0.0p451

4.インストールの確認

ruby -v実行時にダウンロードしたRubyのバージョンが、
以下のように表示されていれば正しくインストールが完了しています。

ruby -v

ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]

インストールしたRubyの実行ファイルパスも確認してみます。

which ruby

/Users/[user_home]/.rbenv/shims/ruby

.rbenv配下にインストールされていればOKです。

rubyのバージョンを切り替える方法

rbenv global [バージョン]
rbenv rehash

rehashコマンドを実行することで、/Users/[user_home]/.rbenv/shims/配下のパスが指定したバージョンへ切り替わります。

Rails の準備

1.Railsのインストール

gemからRailsをインストールします。

gem install rails

インストールの確認。

rails -v

2.bundleのインストール

依存モジュールのインストールを管理するためにbundlerをインストールします。

gem install bundler 

ここまでで、Railsのプロジェクトを作成する準備は完了です。

テストプロジェクトを作成してみる

1.プロジェクトの作成

テスト用のプロジェクトを作成するために、
任意のディレクトリ配下へ移動して以下のコマンドを実行します。

rails new [プロジェクトパス]

これだけで、Railsプロジェクトのひな形が作成されます。

※作成したプロジェクトで使用しているライブラリバージョンの確認

rake about

2.Railsサーバーの起動

Rubyには、標準でWEBrickというWebサーバーが同梱されています。
以下のrails serverというコマンドを実行すると、
他にWebサーバーが使用されていない場合は、WEBrickが自動的に立ち上がります。

rails server

以下のようにログが出力されていれば、正しく起動しています。

=> Booting WEBrick
=> Rails 4.1.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-05-11 19:46:16] INFO  WEBrick 1.3.1
[2014-05-11 19:46:16] INFO  ruby 2.0.0 (2013-02-08) [x86_64-darwin13.1.0]
[2014-05-11 19:46:16] INFO  WEBrick::HTTPServer#start: pid=627 port=3000

試しにhttp://localhost:3000にアクセスしてみて、
以下のようなページがでれば、正しくサーバーが起動しています。

f:id:inon29:20140527004327p:plain

3.テストページの作成

Railsのコントローラとアクションを作成して、
アプリケーションのテストページを表示してみます。

rails generate controller [コントローラ名] [アクション名]

たとえばHogeコントローラのpiyoアクションのページを作成する場合は、

rails generate controller Hoge piyo

とします。

http://localhost:3000/hoge/piyoにアクセスすると、

以下のようなページが表示されると思います。
たったこれだけで、Webアプリケーションのページが作成できました。

f:id:inon29:20140527004358p:plain

rbenvのインストール(Mac)

Rubyのバージョン管理ツールであるrbenvを使って、
Rubyの実行環境をつくってみました。

1.rbenvをインストール

brew install rbenv

インストールが完了したらrbenvの初期設定を行います。
以下の設定を.zshenv.bashrcに記載します。

この設定で、[user_home]/.rbenvディレクトリ配下に書くバージョンのrubyがインストールされるようになります。

# rbenvの初期設定
if which rbenv > /dev/null; then
        export RBENV_ROOT=${HOME}/.rbenv
        export PATH=${RBENV_ROOT}/shims:${PATH}
        eval "$(rbenv init -)";
fi

その他、必要なツールのインストール

brew install ruby-build
brew install rbenv-gemset
brew install rbenv-gem-rehash

2.インストールの確認

ここまでで、正しくrbenvのインストールおよび設定ができているかを確認するために、
以下のコマンドを実行します。

rbenv versions

※ rbenv versions ~ インストール済みのRubyのバージョンを確認

設定されているパスが以下のように自分のホームディレクトリを指していれば、
正しく設定ができています。

* system (set by /Users/[user_home]/.rbenv/version)

3.rubyのインストール

実際に使用するRubyをインストールします。

インストール可能なバージョンの確認

rbenv install -l

Rubyのバージョンをインストール

rbenv install 2.0.0p451

4.インストールの確認

ruby -v

ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]

ダウンロードした、Rubyのバージョンを指していれば正しくインストールされています。

インストールしたRubyの実行ファイルパスも確認してみます。

which ruby

/Users/[user_home]/.rbenv/shims/ruby

.rbenv配下にインストールされていれば大丈夫です。

rubyのバージョンを切り替える時

rbenv global [バージョン]
rbenv rehash

rehashしてあげないと、私の環境ではPATHが切り替わりませんでした。

【Android】youtubeの動画を再生する

Androidで、youtubeの動画を再生するには大きく分けて2つの方法があります。

1つは、youtubeアプリに対してIntentを飛ばす方法で、
例えば下記のように記載することで直接youtubeアプリを起動することができます。

Intent intent = new Intent(Intent.ACTION_SEARCH);
intent.setPackage("com.google.android.youtube");
intent.putExtra("query", "Android");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

もう一つは、YouTube Android Player APIを使用する方法です。
これは、googleが提供しているAPIで、自分のアプリ内でyoutubeの再生機能を利用することができます。
(youtubeを起動はしない)

今回は、YouTube Android Player APIを使用して、 アプリ内で動画を再生する方法を試してみました。

API Keyを作成する

まずは、Google APIをアプリ上で実行するために、 Google Developlers Consoleにて、
APIKeyを取得します。


1.新規プロジェクトを作成

f:id:inon29:20140507210213p:plain

2.Youtube APIを有効にする

APIs & auth を選択し、 YouTube Data API v3をONにします。

f:id:inon29:20140507210701p:plain

3.API Keyを作成する

APIs & auth >Credentials を選択、 Public API accessにあるCREATE NEW KEYボタンを押下します。

f:id:inon29:20140407220058p:plain

キー種別の選択ダイアログが表示されるため、 Android keyを選択します。
続いて、表示されるテキストボックスにAndroidに組み込むkeystoreのSHA1のフィンガープリントおよび、
API実行を許可するアプリケーションのパッケージ名を入力します。

f:id:inon29:20140407220350p:plain

入力フォーマットは、[フィンガープリント];(セミコロン)[パッケージ名]となっています。

CREATEボタンを押下すれば、API keyの作成は完了です。
完了後に画面に表示されているAPI keyAndroidアプリケーションに組み込んで使用します。

例: 9F:DA:1F:03:71:4B:1E:BD:90:76:51:AB:26:0C:B7:41:2F:94:AB:C6;com.sample.gcmtest

※ keystoreのフィンガープリントを確認するには

■ 使用するコマンド

keytool -exportcert -alias androiddebugkey -keystore [署名するkeystoreのパス] -list -v

今回は、Android ADTで用意されているデバッグ用のkeystoreで確認します。
デバッグ用のkeystoreは、[ユーザーHOME]/.android/debug.keystoreにデフォルトkeyが配置されていて、 パスワードは、androidです。

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v

上記のコマンド実行結果から、表示されるフィンガープリントのSHA1の文字列をコピーすればOKです。


Androidアプリの実装

今回は、youtubeのプレーヤーをFragmentとして使用するサンプルアプリを実装します。

1.YouTube Android Player APIの最新バージョンをダウンロード

YouTube Android Player APIの最新版をダウンロードし、libs/にあるYouTubeAndroidPlayerApi.jarをプロジェクトへインポートします。

2.AndroidManifestの実装

下記、パーミッションを追加します。

<uses-permission android:name="android.permission.INTERNET"/>

3.layout.xmlYouTubePlayerFragmentを定義

今回は、動画の再生に使用するYouTubePlayerFragmentをlayout.xmlに定義して使用します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
      android:name="com.google.android.youtube.player.YouTubePlayerFragment"
      android:id="@+id/youtube_fragment"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>

</LinearLayout>

4.Activityの実装

下記サンプルでは、Activityに登録されたYouTubePlayerFragmentインスタンスを、
上記で取得したAPI Keyで初期化しています。

また、初期化のコールバックを取得するために、YouTubePlayer.OnInitializedListenerを実装し、
初期化が成功したタイミングでプレーヤーの実行準備を行っています。

APIの詳細については、YouTube Android Player API - リファレンス ガイドを参照してください。

public class MainActivity extends Activity implements YouTubePlayer.OnInitializedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // フラグメントインスタンスを取得
        YouTubePlayerFragment youTubePlayerFragment =
                (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
        
        // フラグメントのプレーヤーを初期化する
        youTubePlayerFragment.initialize("[API Key]", this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onInitializationFailure(Provider provider,
            YouTubeInitializationResult error) {
            // プレーヤーの初期化失敗時に呼ばれる
    }

    @Override
    public void onInitializationSuccess(Provider provider, YouTubePlayer player,
            boolean wasRestored) {
            // プレーヤーの初期化成功時に呼ばれる
        if (!wasRestored) {
            // 指定された動画のサムネイルを読み込み、プレーヤーがその動画を再生する準備を行う
            player.cueVideo("nCgQDjiotG0");
          }
        
    }

}

これだけで、アプリ内でyoutubeの動画を再生することができます。
他にも、ウィジェットなどのAPIも用意されているようなので、 色々試して見たいと思います。

参考リンク

https://developers.google.com/youtube/android/player/ https://developers.google.com/youtube/android/player/setup

Appiumを使ってRubyでAndroidアプリのテストを行う①

Appiumをインストール

sudo npm install -g appium
npm install wd
appium &

Appiumリポジトリをクローン

git clone https://github.com/appium/appium.git

テスト実行環境を確認

以下のスクリプトを実行して、テストに必要な環境の構築を行います。
ビルドパスやコマンドが不足している場合は、必要に応じてインストールします。

cd appium
./reset.sh --verbose

参考までに私の環境でエラーになった内容について記載しておきます。

[mavenがインストールされていなかった]

Homebrewでインストール。

brew install maven

[androidSDKのAPI Level16がインストールされていなかった]

Android SDK Managerから指定のAPIをインストール。

android

テスト実行環境をインストール

今回は、Rubyでテストを行うつもりなので以下を実行します。

cd appium/sample-code/examples/ruby
bundle install

ここでハマったのが、bundle install時に以下のエラーでて、ビルドが失敗していました。

An error occurred while installing ffi (1.9.3), and Bundler cannot continue.
Make sure that `gem install ffi -v '1.9.3'` succeeds before bundling.

原因は、Xcode 5.1 へのアップデートによってclangが更新されたためとのことです。
下記のサイトを参考にさせていただき、

ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future bundle install

とすることで、成功しました。

参考サイト:

【Mac】clang によるビルドエラー【Xcode 5.1】

rspecのインストール

Appiumの実行には、Rspecを使用するため、gemでインストールしておきます。

gem install rspec

ここまでで、テストを実行する準備が整いました。
次回は、具体的にどうやってテストを書けばいいかを書いていきたいと思います。

参考サイト

http://qiita.com/2or3/items/261862eebbccc436265b
http://iti.hatenablog.jp/entry/2013/12/25/085726

【Android】NFCを使ってみる① (読み込み処理)

NFC(Near Field Communication)は、近距離無線のテクノロジーで、
Android 2.3からサポートされている技術です。

また、Android 4.0からは、Android Beamという機能が加わり、
2つのAndroid搭載のデバイス間でのピアツーピアのデータ交換が可能となりました。

アプリケーションへの NFC タグのディスパッチ方式

AndroidデバイスがNFCを検知すると対応するインテントを発行します。
NFCに関する起動インテントには、下記の3種類があり、 それぞれの優先度が決まっています。

[ACTION_NDEF_DISCOVERED]

読み込んだタグが、NDEF(NFC Data Exchange Format)ペイロードを持つ場合、
このアクションが定義されたアクティビティにIntentが通知されます。

起動インテントの優先度としては、最も高く、
このアクションでアクティビティが起動した場合は、ACTION_TECH_DISCOVEREDまたはACTION_TAG_DISCOVEREDで登録されているアクティビティがあっても起動されません。

[ACTION_TECH_DISCOVERED]

ACTION_NDEF_DISCOVEREDインテントをハンドルするアクティビティが登録されていない場合には、 このアクションでが定義されたアクティビティにIntentが通知されます。 優先度としては、ACTION_NDEF_DISCOVEREDの次に高いです。

[ACTION_TAG_DISCOVERED]

このインテントACTION_NDEF_DISCOVERED または、ACTION_TECH_DISCOVEREDインテントをハンドルするアクティビティがない場合に開始されます。

読み込みサンプル

以下のサンプルは、NFCカードをかざすとNFCの識別子情報を読み取るサンプルになります。

Android Manufestの定義

Android Manufestには、NFCを使用するためのパーミッションの定義と、
各ディスパッチ方式に対応するintent-filterの定義が必要です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.nfcreadsample"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- NFCを使用する為のパーミッションを付与 -->
    <uses-permission android:name="android.permission.NFC" />
    <!-- Google Playで、NFCハードウェアを持つデバイスのみに制限するための   機能を定義 -->
    <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

    ・・・

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.test.nfcreadsample.MainActivity"
            android:label="@string/app_name" >
            
             ・・・
            
            <!-- NFC NDEF text -->
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
            
            <!-- NFC TECH -->
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <!-- ACTION_TAG_DISCOVEREDで登録するフィルタを参照する -->
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
            
            <!-- NFC TAG -->
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED" />

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

</manifest>

ACTION_NDEF_DISCOVEREDインテントをフィルタするには、
フィルタしたい対象データのタイプを加えたインテントフィルタを宣言します。
上記では、ACTION_NDEF_DISCOVEREDフィルタにtext/plainMIMEタイプを付加しています。

ACTION_TECH_DISCOVEREDインテントをフィルタさせる場合は、
XMLリソースファイルを作成し、tech-listセットの中にアクティビティがサポートするNFCのフォーマット形式を定義します。

作成したXMLファイルは、<project-root>/res/xmlディレクトリ配下へ保存します。

以下は、tech-listリソースファイルのサンプルです。

nfc_tech_filter.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

NFCを読み込む

下記では、起動Activityより受信インテントを受け取り、
NFCの起動によるものかを判定しています。

インテントNFCのアクションである場合、
NfcAdapter.EXTRA_IDというキーを使ってNFCIDm(固有識別子)を読み込んでいます。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Intent intent = getIntent();
        String action = intent.getAction();
        
        setContentView(R.layout.activity_main);
        
        // NFCかどうかActionの判定
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
                ||  NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                ||  NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            
            // IDm(固有識別子)を表示させる
            String idm = getIdm(getIntent());
            if (idm != null) {
                TextView idmView = (TextView) findViewById(R.id.idm);
                idmView.setText(idm);
            }
        }
    }

    /**
     * IDmを取得する
     * @param intent 受信インテント
     * @return IDm文字列
     */
    private String getIdm(Intent intent) {
        String idm = null;
        StringBuffer idmByte = new StringBuffer();
        byte[] rawIdm = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        if (rawIdm != null) {
            for (int i = 0; i < rawIdm.length; i++) {
                idmByte.append(Integer.toHexString(rawIdm[i] & 0xff));
            }
            idm = idmByte.toString();
        }
        return idm;
    }
}