J'ai actuellement deux activités. Un pour extraire l’image de la carte SD et un pour la connexion Bluetooth.
J'ai utilisé un paquet pour transférer l'URI de l'image de l'activité 1.
Maintenant, ce que je souhaite, c’est d’obtenir cette Uri dans l’activité Bluetooth et de la convertir en état transmissible via des tableaux d'octets. J'ai vu quelques exemples, mais je n'arrive pas à les faire fonctionner pour mon code!
Bundle goTobluetooth = getIntent().getExtras();
test = goTobluetooth.getString("ImageUri");
est ce que je dois le tirer à travers, quelle serait la prochaine étape?
Merci beaucoup
Jake
De Uri
à obtenir byte[]
je fais les choses suivantes,
InputStream iStream = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(iStream);
et la méthode getBytes(InputStream)
est:
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();
}
Meilleure pratique Java: ne jamais oublier de fermer tous les flux que vous ouvrez! Ceci est mon implémentation:
/**
* 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 est très concis ici:
@Throws(IOException::class)
private fun readBytes(context: Context, uri: Uri): ByteArray? =
context.contentResolver.openInputStream(uri)?.buffered()?.use { it.readBytes() }
En Kotlin, ils ont ajouté des fonctions d’extension pratiques pour InputStream
comme buffered
, use
et readBytes
.
buffered
décore le flux d'entrée en tant que BufferedInputStream
use
gère la fermeture du fluxreadBytes
fait le travail principal de lecture du flux et d’écriture dans un tableau d’octetsCas d'erreur:
IOException
peut survenir pendant le processus (comme en Java)openInputStream
peut retourner null
. Si vous appelez la méthode en Java, vous pouvez facilement superviser cela. Pensez à la façon dont vous voulez gérer ce cas.utilisez getContentResolver (). openInputStream (uri) pour obtenir un InputStream à partir d'un URI. et ensuite lire les données du flux d'entrée convertir les données en octet [] à partir de ce flux d'entrée
Essayez avec le code suivant
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();
}
Référez-vous à ces liens
Ce code fonctionne pour moi
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();
}