В настоящее время мое Android-приложение использует URL для электронной таблицы Google, вставляя ее из буфера обмена, считывая QR-код или считывая из NFC.У меня проблемы с записью в тег NFC, и я получаю эту ошибку:
[ОШИБКА: nfa_rw_act.cc (1571)] Невозможно записать NDEF.Тег maxsize = 137, размер записи запроса = 171
Я не могу записать в этот тег, потому что полезная нагрузка, которую я пытаюсь записать, больше, чем место для записи на нем.
Все, что я пытаюсь сделать, это записать URL-адрес, который я уже прочитал (из буфера обмена или QR), в тег NFC, а также добавить запись моего приложения, чтобы он запустил Play Store в мое приложение, если у пользователя нетон уже установлен.К сожалению, кажется, что это слишком много данных.Я думал о том, чтобы включить только значение spreadsheetID, но думаю, что в будущем это усложнит ситуацию, когда я неизбежно захочу добавить поддержку электронных таблиц вне Google Sheets.
Вот как я пишу это в настоящее время:
public NdefMessage createNdefMessage() {
String text = "https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit?usp=sharing";
NdefRecord appRecord = NdefRecord.createApplicationRecord(context.getPackageName());
NdefRecord relayRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, new String("application/" + context.getPackageName()).getBytes(Charset.forName("US-ASCII")), null, text.getBytes());
return new NdefMessage(new NdefRecord[] {relayRecord, appRecord});
}
Запись только идентификатора (в данном случае "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms") является единственным вариантом?Я также предполагаю, что тег NFC, который я использую, имеет средний размер, а не очень маленький для 2018 года.
РЕДАКТИРОВАТЬ:
Благодаря Майклу я смог привести его в соответствиеправда, едва (134/137 байт).Я пишу URI в NFC через это:
NdefRecord relayRecord = NdefRecord.createUri(text);
Я добавил этот фильтр намерений, чтобы поймать его:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https" android:host="docs.google.com"/>
</intent-filter>
И я прочитал тег NFC с этим:
NdefMessage[] messages = new NdefMessage[rawMessages.length];
for (int i = 0; i < rawMessages.length; i++) {
messages[i] = (NdefMessage) rawMessages[i];
}
for (NdefRecord r : messages[0].getRecords()) {
if (r.getTnf() == NdefRecord.TNF_WELL_KNOWN) {
byte[] payload = r.getPayload();
try {
String payloadText = new String(payload, 1, payload.length - 1, "UTF-8");
int firstByte = payload[0];
return getUriPrefix(firstByte) + payloadText;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "Read error";
}
}
}
И первый байт от сжатия URI, который я получаю через это, хотя я всегда назначаю «04» (4, когда я читаю его как int) в моем приложении:
private String getUriPrefix(int firstByte) {
if (firstByte == 0) {
return "";
} else if (firstByte == 1) {
return "http://www.";
} else if (firstByte == 2) {
return "https://www.";
} else if (firstByte == 3) {
return "http://";
} else if (firstByte == 4) {
return "https://";
} else {
return "";
}
}