現在、2つの活動を行っています。 1つはSDカードからイメージをプルするためのもので、もう1つはBluetooth接続用です。
バンドルを利用して、アクティビティ1の画像のUriを転送しました。
今私がやりたいことは、BluetoothアクティビティのUriをバイト配列を介して送信可能な状態に変換し、いくつかの例を見てきましたが、私のコードでそれらを動作させることができないようです!
Bundle goTobluetooth = getIntent().getExtras();
test = goTobluetooth.getString("ImageUri");
次のステップは何でしょうか?
どうもありがとう
ジェイク
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();
}
_
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;
}
Kotlinはここでは非常に簡潔です。
@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でメソッドを呼び出すと、これを簡単に監視できます。この場合の処理方法について考えてください。getContentResolver()。openInputStream(uri)を使用して、URIから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();
}
このリンクを参照してください
このコードは私のために働く
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();
}