web-dev-qa-db-ja.com

Android NFCタグの読み書き方法は?

私はNFCTestのadam rockerソースコードを使用していくつかのチュートリアルを実行しました。 NFCタグを読み書きしたり、アプリケーションを起動したりできるようにしたい。

15
ogfasasi

NDEF Tools for Android ユーティリティプロジェクトは、次の作業に役立ちます

  1. 検出 、次に
  2. 読み取り または 書き込み 、または
  3. ビーム (プッシュ)NFCコンテンツ

プロジェクトには、すべての標準化されたNDEFレコードタイプのデータバインディングも含まれています。これにより、Android SDKに含まれる(バイト配列ベースの)NDEFクラスを操作する場合と比べて、作業が非常に簡単になります。

また、グラフィカルNDEFエディターについては NFC Eclipseプラグイン を参照してください。タグとビームの読み取りと書き込みを行うユーティリティ app が付属し、NFCリーダーも備えています統合。

ところで、アプリを起動するためのAndroidアプリケーションレコードを探しています。ローンチの「機能」には、実際の実装は必要ありません。 Android> = 4.0に組み込まれているため、そのレコードをタグに配置するだけで十分です。

15
ThomasRS

まず、NFCのAndroidManifest.xmlファイルで権限を取得する必要があります。権限は次のとおりです。

<uses-permission Android:name="Android.permission.NFC" />
<uses-feature Android:name="Android.hardware.nfc" />

NFC読み取り/書き込み操作を実行するアクティビティ。このインテントフィルターをAndroidManifest.xmlファイルのアクティビティに追加します。

          <intent-filter>
            <action Android:name="Android.nfc.action.TAG_DISCOVERED" />

            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>

アクティビティのonCreate()メソッドで、NFCアダプターを初期化し、保留中のインテントを定義する必要があります。

NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);   
if (mAdapter == null) {
    //nfc not support your device.
    return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
        getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

OnResume()コールバックでフォアグラウンドディスパッチを有効にして、NFC=インテントを検出します。

mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

OnPause()コールバックでは、フォアグラウンドディスパッチを無効にする必要があります。

    if (mAdapter != null) {
        mAdapter.disableForegroundDispatch(this);
    }

OnNewIntent()コールバックメソッドでは、新しいNfcインテントを取得します。 The Intentを取得したら、インテントを解析してカードを検出する必要があります。

@Override
protected void onNewIntent(Intent intent){    
    getTagInfo(intent)
}

private void getTagInfo(Intent intent) {
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}

今、あなたはタグを持っています。次に、タグ技術リストをチェックして、そのタグを検出できます。タグ検出手法はこちら My Another Answer 完全なプロジェクトはこちら My github profile

11

まず、これらをマニフェストに入れます:

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

そして、あなたがNFCを読みたいあなたの活動にこれを入れてください:

<intent-filter>
                <action Android:name="Android.nfc.action.TAG_DISCOVERED" />
                <category Android:name="Android.intent.category.DEFAULT" />
            </intent-filter>

最後に、私のアクティビティのように追加してください:

/ * * Copyright(C)2010 The Android Open Source Project * Copyright(C)2011 AdamNybäck* * Apache License、Version 2.0( "License");の下でライセンス*ライセンスに準拠する場合を除き、このファイルを使用しないでください。*ライセンスのコピーは* * http://www.Apache.org/licenses/LICENSE-2. * *で取得できます。適用法または書面で合意されたソフトウェア*ライセンスに基づいて配布されるソフトウェアは、「現状のまま」で配布されます。*保証なしOR明示または黙示のいかなる条件も適用されません。* *ライセンスに基づく特定の言語のライセンスおよび制限* /

package ***.***.***.***;

import Android.app.Activity;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.graphics.Color;
import Android.graphics.drawable.AnimationDrawable;
import Android.nfc.NdefMessage;
import Android.nfc.NdefRecord;
import Android.nfc.NfcAdapter;
import Android.nfc.Tag;
import Android.nfc.tech.Ndef;
import Android.os.Bundle;
import Android.os.Parcelable;
import Android.support.v4.view.ViewPager;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.Toolbar;
import Android.util.Log;
import Android.view.View;
import Android.widget.ImageView;
import Android.widget.TextView;
import Android.widget.Toast;

import com.balysv.materialripple.MaterialRippleLayout;
import com.blogspot.Android_er.androidnfctagdiscovered.R;
import com.pixelcan.inkpageindicator.InkPageIndicator;

import hpbyp.ir.app.hojre.fragment.slider.SliderPagerAdapter;
import hpbyp.ir.app.hojre.utiles.G;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;

/**
 * An {@link Activity} which handles a broadcast of a new tag that the device just discovered.
 */
public class ActivityLoadDataFromNFC extends AppCompatActivity {
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_load_data_from_nfc);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mAdapter = NfcAdapter.getDefaultAdapter(this);
        if (mAdapter == null) {
            //nfc not support your device.
            return;
        }
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    }

    NfcAdapter mAdapter;
    PendingIntent mPendingIntent;

    @Override
    protected void onResume() {
        super.onResume();
        mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mAdapter != null) {
            mAdapter.disableForegroundDispatch(this);
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        GetDataFromTag(tag, intent);

    }

    private void GetDataFromTag(Tag tag, Intent intent) {
        Ndef ndef = Ndef.get(tag);
        try {
            ndef.connect();
//            txtType.setText(ndef.getType().toString());
//            txtSize.setText(String.valueOf(ndef.getMaxSize()));
//            txtWrite.setText(ndef.isWritable() ? "True" : "False");
            Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            if (messages != null) {
                NdefMessage[] ndefMessages = new NdefMessage[messages.length];
                for (int i = 0; i < messages.length; i++) {
                    ndefMessages[i] = (NdefMessage) messages[i];
                }
                NdefRecord record = ndefMessages[0].getRecords()[0];

                byte[] payload = record.getPayload();
                String text = new String(payload);
                Log.e("tag", "vahid" + text);
                ndef.close();

            }
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
        }
    }

}
2
hoseini_pro

シンプルなNFCライブラリの例をここに示します: https://github.com/mateuyabar/pillowNFC

1
Mateu

あなたが見つけたコードは2.3.3以前の時代を参照していると思います。この時点ではタグを書き込むことはできませんでしたが、Android 2.3.3を使用すると、これは可能です。システムをハッキングして、このようなタグを書き込む必要はありません。

NFC Demo Project: http://developer.Android.com/resources/samples/NFCDemo/index.html をご覧ください。

1
Sven Haiges