Ich habe derzeit zwei Aktivitäten. Eine zum Abrufen des Bildes von der SD-Karte und eine für eine Bluetooth-Verbindung.
Ich habe ein Bündel verwendet, um den Uri des Bildes von Aktivität 1 zu übertragen.
Jetzt möchte ich, dass Uri in die Bluetooth-Aktivität versetzt wird, und es mittels Byte-Arrays in einen übertragbaren Zustand umwandeln. Ich habe einige Beispiele gesehen, aber ich kann sie nicht dazu bringen, für meinen Code zu arbeiten !!
Bundle goTobluetooth = getIntent().getExtras();
test = goTobluetooth.getString("ImageUri");
was muss ich machen? Was wäre der nächste Schritt?
Danke vielmals
Jake
Von Uri
bis byte[]
bekomme ich folgende Dinge,
InputStream iStream = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(iStream);
und die getBytes(InputStream)
-Methode lautet:
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();
}
Java-bewährte Methode: Vergessen Sie nicht, jeden Stream zu schließen, den Sie öffnen. Dies ist meine Implementierung:
/**
* 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;
}
Kotlin ist hier sehr knapp:
@Throws(IOException::class)
private fun readBytes(context: Context, uri: Uri): ByteArray? =
context.contentResolver.openInputStream(uri)?.buffered()?.use { it.readBytes() }
In Kotlin fügten sie praktische Erweiterungsfunktionen für InputStream
hinzu wie buffered
, use
und readBytes
.
buffered
verziert den Eingabestrom als BufferedInputStream
use
übernimmt das Schließen des StreamsreadBytes
erledigt hauptsächlich die Aufgabe, den Stream zu lesen und in ein Byte-Array zu schreibenFehlerfälle:
IOException
kann während des Prozesses auftreten (wie in Java)openInputStream
kann null
zurückgeben. Wenn Sie die Methode in Java aufrufen, können Sie dies leicht übersehen. Überlegen Sie, wie Sie mit diesem Fall umgehen möchten.verwenden Sie getContentResolver (). openInputStream (uri), um einen InputStream von einem URI abzurufen. und lesen Sie dann die Daten aus dem Eingangsstrom und konvertieren Sie die Daten in Byte [] aus diesem Eingangsstrom
Versuchen Sie es mit folgendem Code
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();
}
Verweisen Sie auf diese Links
Dieser Code funktioniert für mich
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();
}
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();
}