1

URLでNFCタグをスキャンするNFCベースのアプリを書いています。タグがスキャンされると、アプリはデータベースから情報を取得し、それをListViewに表示する必要があります。

NFCタグをスキャンするとエラーが発生します。

 Error in http connection java.lang.IllegalArgumentException: Illegal character in scheme at index 0: ??http://abc.com/~090123/get_items.php

logcatは、の??前にいくつかの奇妙な文字を表示しますhttp://

次のコードを使用して、タグにURLを書き込んでいます。

private boolean writeTag(Tag tag) {         
    byte[] uriField = "http://abc.com/~090123/get_items.php".getBytes(Charset.forName("US-ASCII"));
    byte[] payload = new byte[uriField.length + 1];

    System.arraycopy(uriField, 0, payload, 1, uriField.length);         

    NdefRecord uriRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
                NdefRecord.RTD_URI, new byte[0], payload);
    NdefMessage message = new NdefMessage(new NdefRecord[] { uriRecord});
    // ....
}

NFCタグから次のようなインテントを受け取っています。

protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.content_display);           

    Intent intent =  getIntent();    

    if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {

        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
            NfcAdapter.EXTRA_NDEF_MESSAGES);

        if(rawMsgs != null) {           

            NdefMessage msg = (NdefMessage) rawMsgs[0];        

            GetData getData = new GetData(this);
                getData.execute(new String(msg.getRecords()[0].getPayload()));
        }
    }
}

そして、私は次のコードを使用してデータベースから情報を取得しています。

protected BufferedReader doInBackground(String... params) {
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    try {
        HttpClient httpclient = new DefaultHttpClient();

        for (int i = 0; i < params.length; i++) 
        {
            HttpPost httppost = new HttpPost(params[i]);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
             is = entity.getContent();
        }

    } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
    }

    Log.e("Input Stream", "Input Stream:" + is);

    BufferedReader myReader = new BufferedReader(new InputStreamReader(is));

    return myReader;
}

以前のNDEFレコードのインテントフィルターは次のようになっています。

<activity
            android:name=".DisplayContentActivity"
            android:label="@string/app_name" >

            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <data
                    android:host="abc.com"
                    android:pathPrefix="/~090123/get_items.php"
                    android:scheme="http" />

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

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

URIペイロードの最初のバイトはURI識別子コードhttp://www.であり、またはのようなURIプレフィックスmailto:です。ペイロードの長さにバイトを正しく追加し1、URLをコピーするときにのオフセットを使用しました。このバイトを書き込むことはないため、0x00プレフィックスなしで)残ります。つまり、URL全体を書き込む必要があります。これは問題ありませんが、数バイトを節約したい場合0x03はプレフィックスとして設定できます。http://

でペイロードを読み取るときはmsg.getRecords()[0].getPayload()、そのバイトを切り取り、自分でプレフィックスを追加する必要があります。このためのネイティブAndroidAPIはないと思うので、自分でプレフィックスを検索するか、他の回答に記載されているライブラリを試す必要があります。

uriを正しく読み取るには、次のようなものを使用する必要があります。

byte[] payload = msg.getRecords()[0].getPayload();
byte identifierCode = payload[0];

String prefix = getUrlPrefix(identifierCode); // you need to implement this one
String url = prefix +
    new String(payload, 1, payload.length -1, Charset.forName("US-ASCII"));

getData.execute(url);

このメソッドgetUrlPrefixには、識別子コードのプレフィックス文字列を返す単純なswitchステートメントを含めることができます。

ここでコードのリストを見ることができます:NDEFフォーマットについて

Value    Protocol
-----    --------
0x00     No prepending is done ... the entire URI is contained in the URI Field
0x01     http://www.
0x02     https://www.
0x03     http://
0x04     https://
0x05     tel:
0x06     mailto:
0x07     ftp://anonymous:anonymous@
0x08     ftp://ftp.
0x09     ftps://
0x0A     sftp://
...
于 2013-02-10T14:52:23.533 に答える
0

NDEFレコードを正しく解析していません。最初のバイトは文字ではありません。NFCフォーラムの標準を読むか、この状況で役立つように私が作成したこのライブラリを参照してください。Androidのソースコードをチェックして、読み取ろうとしているレコードがどのように構築されているかを確認できます。

于 2013-02-10T14:46:46.487 に答える