2013-02-10 4 views
1

Я пишу приложение на основе NFC, которое сканирует тег NFC с URL-адресом. После проверки тега приложение должно извлекать информацию из базы данных и отображать ее в ListView.Недопустимый символ в полезной нагрузке UDEF URI

Ошибка возникает при сканировании тега 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, таких как t его:

<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> 

Любая помощь будет принята с благодарностью.

ответ

3

Первый байт полезной нагрузки URI является кодом идентификатор URI , это URI, префикс, как http://www. или mailto:. Вы правильно добавили байт к длине полезной нагрузки и использовали смещение 1 при копировании вашего URL-адреса. Вы никогда не записываете этот байт, поэтому он остается 0x00 (без префикса), что означает, что вам нужно написать весь URL. Это нормально, хотя вы можете установить его в 0x03 для префикса http://, если вы хотите сохранить несколько байтов.

При чтении полезной нагрузки с помощью msg.getRecords()[0].getPayload() вам необходимо отключить этот байт и добавить префикс самостоятельно. Я не думаю, что для этого есть собственный API для Android, поэтому вам придется самому искать префикс или попробовать библиотеку, упомянутую в другом ответе.

Чтобы прочитать Ури правильно, вы должны использовать что-то вроде этого:

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 может содержать простое заявление переключатель, чтобы вернуть строку префикса для кода идентификатора.

Вы можете увидеть список кодов здесь: About the NDEF Format

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:[email protected] 
0x08  ftp://ftp. 
0x09  ftps:// 
0x0A  sftp:// 
... 
+0

Привет, я попытался добавить код URI Identifier, как это: байт [] полезная нагрузка = новый байт [uriField. длина + 1]; полезная нагрузка [0] = 0x03; System.arraycopy (uriField, 0, полезная нагрузка, 1, uriField.длина); Я все еще получаю ту же ошибку. – Sujal

+0

@Sujal Главное, чтобы байт кода идентификатора включался в полезную нагрузку при чтении. Я обновил ответ на примере. – Kapep

+0

Спасибо большое! Это решило проблему. – Sujal

0

Неправильно разбор NDEF-записи. Первый байт не является символом. Либо прочитайте в стандарте NFC Forum, либо см. Это lib. Я создал для помощи в этой ситуации. Вы можете проверить исходный код Android, чтобы узнать, как создается запись, которую вы пытаетесь прочитать.

Смежные вопросы