53

現在、2つの活動があります。1つはSDカードからイメージをプルするためのもので、もう1つはBluetooth接続用です。

バンドルを使用して、アクティビティ1から画像のURIを転送しました。

今私がやりたいのは、BluetoothアクティビティでそのURIを取得し、バイト配列を介して送信可能な状態に変換することです。いくつかの例を見ましたが、コードでそれらを機能させることができないようです。

Bundle goTobluetooth = getIntent().getExtras();
    test = goTobluetooth.getString("ImageUri");

それは私がそれを横切って引っ張らなければならないものです。次のステップは何でしょうか?

4

8 に答える 8

113

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();
    }
于 2012-04-24T11:37:08.790 に答える
19

Kotlinはここで非常に簡潔です:

@Throws(IOException::class)
private fun readBytes(context: Context, uri: Uri): ByteArray? = 
    context.contentResolver.openInputStream(uri)?.buffered()?.use { it.readBytes() }

Kotlinでは、、、、などの便利な拡張機能が追加されましInputStreamた。bufferedusereadBytes

  • buffered入力ストリームを次のように装飾しますBufferedInputStream
  • useストリームを閉じる処理
  • readBytesストリームの読み取りとバイト配列への書き込みの主な仕事をします

エラーの場合:

  • IOExceptionプロセス中に発生する可能性があります(Javaのように)
  • openInputStreamを返すことができnullます。Javaでメソッドを呼び出すと、これを簡単に監視できます。このケースをどのように処理するかを考えてください。
于 2019-01-18T09:16:11.717 に答える
5

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;
}
于 2015-09-18T08:47:23.467 に答える
5

kotlinの構文

val inputData = contentResolver.openInputStream(uri)?.readBytes()
于 2019-10-15T13:01:25.240 に答える
0

getContentResolver()。openInputStream(uri)を使用して、URIからInputStreamを取得します。次に、inputstreamからデータを読み取り、そのinputstreamからデータをbyte[]に変換します

次のコードで試してください

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

このリンクを参照してください

于 2012-04-24T12:04:18.990 に答える
0

このコードは私のために働きます

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();
            }
于 2012-04-24T12:09:42.060 に答える
0
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();
    }
于 2015-10-12T14:26:14.413 に答える
0

次の方法を使用して、AndroidStudioでbytesArrayからを作成しますURI

public byte[] getBytesArrayFromURI(Uri uri) {
    try {
        InputStream inputStream = getContentResolver().openInputStream(uri);
        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();

    }catch(Exception e) {
        Log.d("exception", "Oops! Something went wrong.");
    }
    return null;
}
于 2021-11-03T18:19:44.940 に答える