web-dev-qa-db-fra.com

Image Uri en tableau d'octets

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

34
user1314243

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();
    }
73
user370305

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;
}
3
ahmed_khan_89

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 flux
  • readBytes fait le travail principal de lecture du flux et d’écriture dans un tableau d’octets

Cas 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.
0
Peter F

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

0
Shankar Agarwal

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();
            }
0
png
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();
    }
0
krupesh halarnkar