Изображение Uri to bytesarray
В настоящее время у меня есть два вида деятельности. Один для вытягивания изображения с SD-карты и один для подключения Bluetooth.
Я использовал Bundle для переноса Uri изображения из действия 1.
Теперь то, что я хочу сделать, это получить URI в активности Bluetooth и преобразовать его в передаваемое состояние через Byte Arrays. Я видел некоторые примеры, но я не могу заставить их работать для моего кода!!
Bundle goTobluetooth = getIntent().getExtras();
test = goTobluetooth.getString("ImageUri");
- это то, что мне нужно перетащить, Что будет следующим шагом?
Большое спасибо
Джейк
Ответы
Ответ 1
Из Uri
, чтобы получить byte[]
, я делаю следующие вещи:
InputStream iStream = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(iStream);
и метод getBytes(InputStream)
:
public byte[] getBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}
return byteBuffer.toByteArray();
}
Ответ 2
Лучшая практика Java: никогда не забудьте закрыть каждый поток, который вы открываете!
Это моя реализация:
/**
* get bytes array from Uri.
*
* @param context current context.
* @param uri uri fo the file to read.
* @return a bytes array.
* @throws IOException
*/
public static byte[] getBytes(Context context, Uri uri) throws IOException {
InputStream iStream = context.getContentResolver().openInputStream(uri);
try {
return getBytes(iStream);
} finally {
// close the stream
try {
iStream.close();
} catch (IOException ignored) { /* do nothing */ }
}
}
/**
* get bytes from input stream.
*
* @param inputStream inputStream.
* @return byte array read from the inputStream.
* @throws IOException
*/
public static byte[] getBytes(InputStream inputStream) throws IOException {
byte[] bytesResult = null;
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
try {
int len;
while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}
bytesResult = byteBuffer.toByteArray();
} finally {
// close the stream
try{ byteBuffer.close(); } catch (IOException ignored){ /* do nothing */ }
}
return bytesResult;
}
Ответ 3
Котлин здесь очень лаконичен:
@Throws(IOException::class)
private fun readBytes(context: Context, uri: Uri): ByteArray? =
context.contentResolver.openInputStream(uri)?.buffered()?.use { it.readBytes() }
В Kotlin они добавили удобные функции расширения для InputStream
такие как buffered
, use
и readBytes
.
-
buffered
украшает входной поток как BufferedInputStream
-
use
ручки, закрывающие поток -
readBytes
выполняет основную работу по чтению потока и записи в байтовый массив
Случаи ошибки:
-
IOException
может произойти во время процесса (как в Java) -
openInputStream
может возвращать null
. Если вы вызываете метод в Java, вы можете легко контролировать это. Подумайте, как вы хотите справиться с этим делом.
Ответ 4
используйте getContentResolver(). openInputStream (uri), чтобы получить InputStream из URI. а затем считывать данные из входного потока, преобразовывать данные в байт [] из этого входного потока
Попробуйте выполнить следующий код
public byte[] readBytes(Uri uri) throws IOException {
// this dynamically extends to take the bytes you read
InputStream inputStream = getContentResolver().openInputStream(uri);
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();
}
Обратитесь к этим ЛИНКУ
Ответ 5
Этот код работает для меня
Uri selectedImage = imageUri;
getContentResolver().notifyChange(selectedImage, null);
ImageView imageView = (ImageView) findViewById(R.id.imageView1);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media
.getBitmap(cr, selectedImage);
imageView.setImageBitmap(bitmap);
Toast.makeText(this, selectedImage.toString(),
Toast.LENGTH_LONG).show();
finish();
} catch (Exception e) {
Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
.show();
e.printStackTrace();
}
Ответ 6
public void uriToByteArray(String uri)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] buf = new byte[1024];
int n;
try {
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = baos.toByteArray();
}
Ответ 7
Синтаксис в котлине
val inputData = contentResolver.openInputStream(uri)?.readBytes()