Intereting Posts
OnDestroy () – установить или не установить переменные экземпляра в null? Попытка записать звук, но получение сообщения «mediarecorder ушел с необработанными событиями» и «Фатальный сигнал 11 (SIGSEGV) …» Android-браузер завораживает события для двух кранов в быстрой последовательности Настройка предпочтения пользовательского интерфейса. Сводное поле для значения предпочтения. Отображать направление места со стрелкой в ​​Android ListView Как изменить цвет фона вкладки при использовании TabLayout? Выравнивание кнопок панели инструментов Android v7 Firebase Android Настройка по умолчанию и конфиденциальность пользователя Хорошая практика программирования вызывает invalidate () внутри onDraw ()? Пусто InfoWindow при нажатии маркера Получение пути захваченного изображения в android с использованием намерения камеры Android Studio: не удалось найти com.android.tools.build:gradle:2.0.0-alpha2 Добавление нового сетевого носителя на Android Android M Camera Intent + ошибка разрешения? Диалог активности с вкладкой

Android – переход от Uri к InputStream в массив байтов?

Я пытаюсь перейти от Android Uri к массиву байтов.

У меня есть следующий код, но он продолжает говорить мне, что массив байтов имеет длину 61 байт, хотя файл довольно большой – поэтому я думаю, что он может превратить строку Uri в массив байтов, а не файл 🙁

Log.d(LOG_TAG, "fileUriString = " + fileUriString); Uri tempuri = Uri.parse(fileUriString); InputStream is = cR.openInputStream(tempuri); String str=is.toString(); byte[] b3=str.getBytes(); Log.d(LOG_TAG, "len of data is " + imageByteArray.length + " bytes"); 

Пожалуйста, кто-нибудь поможет мне разобраться, что делать?

Результатом является «fileUriString = content: // media / external / video / media / 53» и «len данных – 61 байт».

Благодаря!

Solutions Collecting From Web of "Android – переход от Uri к InputStream в массив байтов?"

is.toString() предоставит вам представление String экземпляра InputStream, а не его содержимое.

Вам нужно прочитать () байты из InputStream в свой массив. Для этого есть два метода чтения: read (), который читает один байт за раз, и читает (byte [] bytes), который считывает байты из InputStream в массив байтов, который вы передаете ему.


Обновление: чтобы прочитать байты, учитывая, что InputStream не имеет длины как таковой, вам нужно прочитать байты, пока ничего не останется. Я предлагаю создать для себя метод, подобный этому, – это простая простая отправная точка (как бы я это сделал, по крайней мере, на Java).

 public byte[] readBytes(InputStream inputStream) throws IOException { // this dynamically extends to take the bytes you read ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); // this is storage overwritten on each iteration with bytes int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; // we need to know how may bytes were read to write them to the byteBuffer int len = 0; while ((len = inputStream.read(buffer)) != -1) { byteBuffer.write(buffer, 0, len); } // and then we can return your byte array. return byteBuffer.toByteArray(); } 

С помощью Apache IO Utils вы можете просто использовать:

Byte [] recordData = IOUtils.toByteArray (inStream);

http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html#toByteArray(java.io.InputStream)

Загрузить jar: http://commons.apache.org/io/download_io.cgi

While ((len = inputStream.read (buffer))! = -1) должно быть

  while (inputStream.available() >0 && (len = inputStream.read(buffer)) != -1) 

Этот способ чтения не будет блокироваться, если поток не имеет доступных байтов, как объясняется в этом ответе .

С помощью Google Guava вы можете использовать ByteStreams.toByteArray(InputStream) чтобы получить все байты во входном потоке:

 InputStream is = ...; byte[] bytes = ByteStream.toByteArray(is); 

Разделите мою идею: D

 private static byte[] getStringFromInputStream(InputStream is) { BufferedReader br = null; StringBuilder sb = new StringBuilder(); byte[] bReturn = new byte[0]; String line; try { br = new BufferedReader(new InputStreamReader(is, "Big5")); while ((line = br.readLine()) != null) { sb.append(line); } String sContent = sb.toString(); bReturn = sContent.getBytes(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return bReturn; } 

Если у вас есть Uri, вместо обычного имени файла вы должны использовать Content Resolver. Android: Получение URI файла из URI контента?

Я пробовал это, и он работает. Ури-ури; // это что-то, у меня есть выбор файла. Конечно, я должен быть уверен, что uri указывает на имя файла, и это не изображение, звук или что-то еще …

 InputStream is=getContentResolver().openInputStream(uri); InputStreamReader ir=new InputStreamReader(is); bu=new BufferedReader(ir); String s; while ((s=bu.readLine())!=null){ //do something with the line... } bu.close(); 

Я пропустил некоторый try-catch, наконец, из кода, но самые важные вещи здесь. Во-первых, если у вас есть uri, вы не можете использовать стандартный считыватель файлов.