2016-06-17 15 views
1

私はAndroidのロリポップ(5.xの)またはマシュマロとデバイス(6.0)にそれを使用する場合、このコードは正常に動作します:方法NdefRecord.createTextRecord(「EN」、「文字列」)APIレベル以下に動作していない21

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public NdefMessage createNdfMessage(String content) { 
    NdefRecord record = NdefRecord.createTextRecord("en", content); 
    NdefMessage msg = new NdefMessage(new NdefRecord[]{record}); 
    return msg; 
} 

Android 4.2.2(APIレベル17)のデバイスでこれを試すと、アプリがクラッシュします。このコードを使用して、21未満のAPIレベル(これはメソッドNdefRecord.createTextRecordが利用可能になったAPIレベル)でテキストレコードを作成するにはどうすればよいですか?

答えて

3

方法NdefRecord.createTextRecord()はしたがって、それはAPIレベル以下のプラットフォームで利用できないAPIレベル21に導入されました。しかし、あなた自身でTextレコードを簡単に組み立てることができます。

 
+-------------+---------------+--------------------------+ 
| Status byte | Language code | Text      | 
| (1 byte) | (n byte)  | (m byte)     | 
+-------------+---------------+--------------------------+ 
  • ステータスバイトがテキストフィールドの文字エンコーディング(0 = UTF-8、1を示し:テキストレコードのペイロードには、ステータスバイト、言語コードフィールド、およびテキストフィールドで構成されてい= UTF-16)と、ビットコード5..0の言語コードの長さn。ビット6は常にゼロでなければなりません。
  • 言語コードフィールドには、US-ASCII(「en」など)でエンコードされたIANA言語コードが含まれています。

あなたは、このメソッドを使用したテキストレコードを作成することができます。

public static NdefRecord createTextRecord(String language, String text) { 
    byte[] languageBytes; 
    byte[] textBytes; 
    try { 
     languageBytes = language.getBytes("US-ASCII"); 
     textBytes = text.getBytes("UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     throw new AssertionError(e); 
    } 

    byte[] recordPayload = new byte[1 + (languageBytes.length & 0x03F) + textBytes.length]; 

    recordPayload[0] = (byte)(languageBytes.length & 0x03F); 
    System.arraycopy(languageBytes, 0, recordPayload, 1, languageBytes.length & 0x03F); 
    System.arraycopy(textBytes, 0, recordPayload, 1 + (languageBytes.length & 0x03F), textBytes.length); 

    return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null, recordPayload); 
} 

NdefRecord r = createTextRecord("en", content); 
+1

助けてくれてありがとう、今はうまくいきます –

0

はい、createTextRecordはAPI 21で導入されているため、以前のバージョンでは呼び出せません。 https://developer.android.com/reference/android/nfc/NdefRecord.html

createTextRecordを呼び出す前にAPIレベルが21であることを確認してください。

public NdfeMessage create(String content){ 
    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= android.os.Build.VERSION_CODES.LOLLIPOP){ 
     NdefRecord record = NdefRecord.createTextRecord("en", content); 
     NdefMessage msg = new NdefMessage(new NdefRecord[]{record}); 
     return msg; 
    } else{ 
     return null; 
    } 
} 
+0

をしかし、私はまた、APIレベル以下のデバイスからプレーン/テキスト21 –

+0

を書きたいあなたはAPIレベル10からのメッセージを書き込むことはできますレベル21の下に新しいレコードを書き込むことはできませんが、同じではありません。 https://developer.android.com/reference/android/nfc/tech/Ndef.html#writeNdefMessage(android.nfc.NdefMessage) –

+1

以下のAPIは、レコードを書き込めないことを意味しませんが、 NdefRecord.createTextRecord'は利用できません。他の回答状態と同じように他の方法で作成することはできます。 –

関連する問題