У меня есть контент-провайдер, который является обычным для моего набора приложений для Android, и одной из вещей, которые ему нужно выставить, является небольшой (20-30 KiB) байтовый массив. URI для этих сгустков выглядит следующим образом:Передача двоичного блоба через контент-провайдера
content://my.authority/blob/#
где #
это номер строки; результирующий курсор имеет стандартный столбец _id
и столбец данных. Я использую MatrixCursor
в query()
методе поставщика:
byte[] byteData = getMyByteData();
MatrixCursor mc = new MatrixCursor(COLUMNS);
mc.addRow(new Object[] { id, byteData });
Позже, в приложении потребляющих данные, я:
Cursor c = managedQuery(uri, null, null, null, null);
c.moveToFirst();
byte[] data = c.getBlob(c.getColumnIndexOrThrow("data"));
Однако данные не содержат содержимое моего оригинального байта массив; скорее, он содержит что-то вроде [[email protected]
, которое больше похоже на адрес массива, чем на содержимое. Я попробовал обернуть массив байтов в реализации java.sql.Blob
, полагая, что он может искать это, поскольку подсистема провайдера контента была написана, чтобы быть простой в использовании с SQLite, но это не помогло.
Неужели кто-нибудь получил это на работу? Если данные были в файловой системе, есть методы в ContentProvider
, которые я мог бы использовать для предоставления маршаллированного InputStream
клиенту, но данные, которые я пытаюсь отправить назад, являются ресурсом в APK поставщика контента.
BTW Я занимаюсь довольно старой версией (андроид-3), если это имеет значение. – user308405
Насколько я понимаю, вы решили эту проблему. Есть ли шанс поделиться им с остальными? –