Why I am getting FileNotFoundException while converting Video Uri to Bytearray? - android

I am converting Video Uri to bytearray but I am getting FileNotFoundException
I have written this code for converting Video Uri to bytearray
video = data.getData();
byte[] buf = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis;
try {
fis = new FileInputStream(new File(video.getPath()));
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
fis.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
bbytes= baos.toByteArray();

Try open stream with ContentResolver:
fis = context.getContentResolver().openInputStream(video);

Related

Unable to create byte[] array of file and vice versa - android

I am unable to create byte[] array of file and and re-create byte[] to file. File creates from byte[] array with exact size what was before, but unable to open it. It say's format is not supported. Like-wise I have to do for more file's like video, audio, docs etc. I have tried answer's available in stack-overflow but no success.
Here is my code:-
To convert image into byte[] array
public static byte[] getBytesFromImage() {
FileInputStream in;
try {
File photo = new File(Environment.getExternalStorageDirectory(), "nature.jpg");
FileInputStream fis = new FileInputStream(photo);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
for (int readNum; (readNum = fis.read(b)) != -1;) {
bos.write(b, 0, readNum);
}
bMapArray = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return bMapArray;
}
To convert byte[] array into image file.
public static String getImageFromBytesTemp() {
File file = new File(Environment.getExternalStorageDirectory(), "nature2.jpg");
if (file.exists()) {
file.delete();
}
try {
FileOutputStream fos=new FileOutputStream(file.getAbsolutePath());
fos.write(bMapArray);
fos.close();
}
catch (IOException e) {
e.printStackTrace();
}
return file.getAbsolutePath();
}
Your code is ok,
maybe you simply need to flush your ByteArrayOutputStream
for (int readNum; (readNum = fis.read(b)) != -1;) {
bos.write(b, 0, readNum);
}
bMapArray = bos.toByteArray();
bos.flush();
bos.close();

Not able to convert image from url into byte array

I am new to android and I need to save image from url into db and fetch it from db. I an converting image from link into byte array but getting the following error:
Cannot Resolve ByteArrayBuffer
This is the code:
private byte[] getLogoImage(String url){
try {
URL imageUrl = new URL(url);
URLConnection ucon = imageUrl.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(500);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
return baf.toByteArray();
} catch (Exception e) {
Log.d("ImageManager", "Error: " + e.toString());
}
return null;
}
Update your method getLogoImage() as below.
Use AsyncTask and call this method from doInBackground().
Here is the working code. Try this:
private byte[] getLogoImage(String url) {
try {
URL imageUrl = new URL(url);
URLConnection ucon = imageUrl.openConnection();
InputStream is = ucon.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int read = 0;
while ((read = is.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, read);
}
baos.flush();
return baos.toByteArray();
} catch (Exception e) {
Log.d("ImageManager", "Error: " + e.toString());
}
return null;
}
Try like this
Bitmap bm = null;
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
byte[] imageArray = getBytes(bm);
and after this use below method
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
return stream.toByteArray();
}
Use This
BitmapFactory.Options options = null;
options = new BitmapFactory.Options();
options.inSampleSize = 3;
Bitmap bitmap = BitmapFactory.decodeFile(url,
options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 50, stream);
byte[] byte_arr = stream.toByteArray();

Base64 from ByteArray

I have tried to use code below in my application to encode a jpg file to Base64.
InputStream inputStream = null;
try {
inputStream = new FileInputStream(imagelocation);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
bytes = output.toByteArray();
String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
Log.d(TAG, encodedString);
Output is following:
/9j/4Tj5RXhpZgAASUkqAAgAAAAPAA4BAgAgAAAAwgAAAA8BAgAgAAAA4gAAABABAgAgAAAAAgEA
ABIBAwABAAAAAQAAABoBBQABAAAAIgEAABsBBQABAAAAKgEAACgBAwABAAAAAgAAADEBAgAgAAAA
MgEAADIBAgAUAAAAUgEAABMCAwABAAAAAgAAACACAwABAAAAAAAAACECBAABAAAAAAAAACICAwAB
AAAAAAAAACMCAwABAAAAAAAAAGmHBAABAAAAZgEAAMQCAAAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIABIAAAAAQAAAEgAAAABAAAATWVkaWFUZWsgQ2FtZXJhIEFwcGxpY2F0
aW9uAAAAAAAyMDE2OjAzOjMxIDIyOjMyOjEzABYAmoIFAAEAAAB0AgAAnYIFAAEAAAB8AgAAIogD
AAEAAAAAAAAAJ4gDAAEAAABQAQAAAJAHAAQAAAAwMjIwA5ACABQAAACEAgAABJACABQAAACYAgAA
AZEHAAQAAAABAgMABJIKAAEAAACsAgAAB5IDAAEAAAACAAAACJIDAAEAAAD/AAAACZIDAAEAAAAA
AAAACpIFAAEAAAC0AgAAAKAHAAQAAAAwMTAwAaADAAEAAAABAAAAAqAEAAEAAAAACgAAA6AEAAEA
AACABwAABaAEAAEAAAA6AwAAAqQDAAEAAAAAAAAAA6QDAAEAAAAAAAAABKQFAAEAAAC8AgAABqQD
AAEAAAAAAAAAAAAAAARxAgBAQg8AHAAAAAoAAAAyMDE2OjAzOjMxIDIyOjMyOjEzADIwMTY6MDM6
MzEgMjI6MzI6MTMAAAAAAAoAAABeAQAAZAAAAGQAAABkAAAACAADAQMAAQAAAAYAAAASAQMAAQAA
AAEAAAAaAQUAAQAAACoDAAAbAQUAAQAAADIDAAAoAQMAAQAAAAIAAAABAgQAAQAAAHEEAAACAgQA
AQAAAIA0AAATAgMAAQAAAAIAAAAAAAAASAAAAAEAAABIAAAAAQAAAAIAAQACAAQAAABSOTgAAgAH
AAQAAAAwMTAwAAAAAPP/8//0//T/8v/y/+z/7P/u/+7/9f/1/+r/6v/T/9P/wP/A/7z/vP/E/8T/
zf/N/8//z//Q/9D/1v/W/9r/2v/Y/9j/3P/c/9//3//R/9H/wv/C/7z/vP+5/7n/vv++/83/zf/R
/9H/zf/N/9T/1P/d/93/3v/e/9//3//g/+D/1f/V/7f/t/+c/5z/mv+a/57/nv+Y/5j/mv+a/6X/
pf+m/6b/qP+o/7z/vP/X/9f/5f/l/+3/7f/+//7/CAAIAP7//v/w//D/5P/k/8v/y/+4/7j/uP+4
/6z/rP+Y/5j/of+h/6z/rP+S/5L/gv+C/5n/mf+s/6z/uP+4/8H/wf+y/7L/of+h/6H/of+S/5L/
ev96/4P/g/+U/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUE
BAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUK
BwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAAR
CACAAKADASEAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgED
AwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRol
JicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWW
l5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3
+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3
AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan
qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIR
AxEAPwD9iG+FPwttGZT8MpITk/NPrUqj7nmAs3lkACPdk8gOAg3EnGSunaNZXcsfhqJ7SxaUmKFn
3N9ST1J/+t2rwc0lCFFRirN/1+Z9Vw7RnUxMqstor8X/AMC/3iNCsjljMxxxuJFSR28QU4LH/gXU
183KKbPtuZ2sNEUDH5w2M4+93qSyNol7FuSQqJV3fN2yM1w1+xd5M/lP/b00zw78Jv22Pir8P7zR
vtU9p48vHitry4YR4MxOCMjapBHQE5z04r0P9n/9pjxf4p1O8j8QeHvAugxWUZDzeLPF2o28bRhS
zOTiXKpgZbHBIyO9fd4OhGeXUn/djt6I/PM2xVaGaVkn9qX4tv8AU4r9rj4n+HdY1K001tS+F/iK
2u8y/wDFFeKPt7BxjmUyWsbofQAkHmvC9U1bw1ctIX8CWjAy7twTIXsMHYP1r0oQly/5ni+0uzO1
jxcJVlOj6U9haxgZgtnUKme+GG5skE965rU9Zi1G48+c3ErhQo3bOQPXAHFXCFteoVKrnK40Xdla
3G+Oe6CtySFxnntirL6zZBsSz6gxHGWbkVTgpaiVapFWT0EGraWzFfOu8k5bzMHnviql3c6dLKpS
7kbPVp0H5fSrUbClVnLc2fAfwt8dfFXUrvTPhf4J1rxHeWNobu+t9D02S6kt4AyoZWVASqbmVc46
sB3rp7/9nn4k+GUWPxV8O/G2nXm91eC78E3ibSjEOQxTnaVIPuppuSj1Dmkb1lpFl4MjNhqfjddO
dXAVda8N31swYqHH316lWDY67WB6EGrK+KtPEjbfFejXyqn+tsXlDA98q4H45rlxGG+sL3v6/wCH
O6hmM6Nla5/X34/8Xw6fO/gzSbhZIrbZHdTRzOY32Z8uJQzH5Yw2Cc/M2Selc7ba0SgfyTnPOWFf
M4+t7XEO2y0R91kmBeHy+N95av57fhYn/taFh5bQsPckU19ZtowxWNm9MmvKnax7SoSbsiJ9eXaG
ETdepIql488Z6b8Mfhlr3xm8cpcaf4Z8M6TcanrWqywEJBbQoXdhnG44BwoOWJAHWvNnSq4ifLTT
b8grKlhoc9WSS8z+dD9tux+Ff/BRr9sfxj+1H4e+HmqeFNP1NbdzpsVws8srIChu7jahEbSHBZV+
VcgAkjNdFrn/AAQm8HeK/wBleP8AaL/Z/wDjV4q8VaxN4w0fQT4NPhgW+Wu8efJPcxySC2hRUlJn
kUR5KFmUPgfoeDjVwWDp0pa8qSZ+V5jiYY7HTqxVk3p+Rx5/4IcfHzxDr+veD9U+Et94CXQfC0vi
G51u81631S3uIEuba1W2SS3GyOV3uVZVdwzLG+AcHHh3xL/4Jy6/8O7hre4+I87gAhwbIk5HU8Ng
iun6171rXOJw0uea6z+zPNpn7xvHhlV32xO1kRuHGercdf5diDXOXfwa1K3n8pPEUTgtjd5DA/kT
/wDq71rGqpENMif4TanFIIR4kt1kORtaNwDj39c1Xb4cazGmY/EVs+cDAL8nuM47etUqibFuA+G3
iYweemr2zKTtOZHz3wOlRDwB4rdxHFdwMd2B++Pb04qudN2BnU/CrW/j18F/EMvi/wCFfjmLR9Qe
OOOW5hdHMsaTxzKrK8bKyebDExUgg7QGBBwfYLX/AIKE/wDBSuzht7KL9
Already tried to put this code into several decoders, but cannot convert this code back to a picture. What should be the problem?

Convert a file (<100Mo) in Base64 on Android

I am trying to convert a file from the sdcard to Base64 but it seems the file is too big and i get an OutOfMemoryError.
Here is my code :
InputStream inputStream = null;//You can get an inputStream using any IO API
inputStream = new FileInputStream(file.getAbsolutePath());
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
bytes = output.toByteArray();
attachedFile = Base64.encodeToString(bytes, Base64.DEFAULT);
Is there a way to go around the OutOfMemoryError while filing the String attachedFile ?
Base64 encoding takes 3 input bytes and converts them to 4 bytes. So if you have 100 Mb file that will end up to be 133 Mb in Base64. When you convert it to Java string (UTF-16) it size will be doubled. Not to mention that during conversion process at some point you will hold multiple copies in memory. No matter how you turn this it is hardly going to work.
This is slightly more optimized code that uses Base64OutputStream and will need less memory than your code, but I would not hold my breath. My advice would be to improve that code further by skipping conversion to string, and using temporary file stream as output instead of ByteArrayOutputStream.
InputStream inputStream = null;//You can get an inputStream using any IO API
inputStream = new FileInputStream(file.getAbsolutePath());
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);
try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output64.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
output64.close();
attachedFile = output.toString();
// Converting File to Base64.encode String type using Method
public String getStringFile(File f) {
InputStream inputStream = null;
String encodedFile = "", lastVal;
try {
inputStream = new FileInputStream(f.getAbsolutePath());
byte[] buffer = new byte[10240]; //specify the size to allow
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);
while ((bytesRead = inputStream.read(buffer)) != -1) {
output64.write(buffer, 0, bytesRead);
}
output64.close();
encodedFile = output.toString();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
lastVal = encodedFile;
return lastVal;
}

Saving and retreving photos and videos in Parse (Android)

I was looking at the Parse Android docs and saw that to save photos and videos, you have to initialize a new ParseFile with a name and a byte[] of data and save it.
What's the easiest way to convert an image Uri and video Uri to a byte array?
Here are my attempted solutions:
mPhoto = new ParseFile("img", convertImageToBytes(Uri.parse(mPhotoUri)));
mVideo = new ParseFile ("vid", convertVideoToBytes(Uri.parse(mVideoUri)));
private byte[] convertImageToBytes(Uri uri){
byte[] data = null;
try {
ContentResolver cr = getBaseContext().getContentResolver();
InputStream inputStream = cr.openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
data = baos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return data;
}
private byte[] convertVideoToBytes(Uri uri){
byte[] videoBytes = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(new File(getRealPathFromURI(this, uri)));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
videoBytes = baos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return videoBytes;
}
private String getRealPathFromURI(Context context, Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Video.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null,
null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
The convertImageToBytes and convertVideoToBytes methods work for now, but I'm just wondering If I'm doing doing this correctly.
From Uri to get byte[] I do the following things,
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(new File(yourUri));
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
byte[] videoBytes = baos.toByteArray(); //this is the video in bytes.

Categories

Resources