java - Android can't display some of the images transferred over socket -
my app sends text , image other devices in lan. looks images transmitted , received (i don't exception @ all) somehow, of images not displayed or not displayed @ in imageview of cardviewadapter.
when receive image, create file , save createfile method. transmit image type , save extension. don't know depends on, couldn't resolve it.
class send image on tcp:
public class imagetransferhandler implements runnable{ private static final string tag = "imagetransferhandler"; private static final int server_port = 8700; private socket socket; private context context; private string hostipaddress; private bar bar; public clientthreadprocessor(string hostipaddress, context context, bar bar){ this.context = context; this.hostipaddress = hostipaddress; this.bar = bar; } private socket getsocket(string hostipaddress) { inetaddress serveraddr = inetaddress.getbyname(hostipaddress); socket = new socket(serveraddr, server_port); return socket; } private void closesocket(socket socket) { socket.close(); } @override public void run() { socket = getsocket(hostipaddress); outputstream outputstream = socket.getoutputstream(); printwriter output = new printwriter(new bufferedwriter( new outputstreamwriter(outputstream)), true); output.println(bar.getimageinfo().iscamera()); uri imageuri = uri.parse(bar.getimageinfo().getpath()); string mimetype = imagepicker.getmimetype(context, imageuri); string ext = mimetype.substring(mimetype.lastindexof("/") + 1); if(ext == null) ext = "bmp"; output.println(ext); bufferedoutputstream bout = new bufferedoutputstream(outputstream); string realpath = imagepicker.getrealpathfromuri(context, imageuri); inputstream input = new fileinputstream(realpath); byte[] buffer = new byte[1024]; int len; while ((len = input.read(buffer)) != -1) { bout.write(buffer); } input.close(); bout.close(); log.d(tag, "image sent on network , stream closed."); output.close(); closesocket(socket); } } class receives image on tcp
public class imagereceivehandler implements runnable{ private static string tag = "imagereceivehandler"; private socket socket; private context context; private bufferedreader inputbufferedreader; private printwriter outputprintwriter; private bar bar; public clienthandler(socket socket, context context){ this.socket = socket; this.context = context; } @override public void run() { inputstream input = socket.getinputstream(); inputbufferedreader = new bufferedreader( new inputstreamreader(input)); outputprintwriter = new printwriter(new bufferedwriter( new outputstreamwriter(socket.getoutputstream())), true); boolean iscamera = boolean.valueof(inputbufferedreader.readline()); string ext = inputbufferedreader.readline(); file imagefile = imagepicker.createfile(context, imagepicker.isexternalstoragewritable(), ext); if (imagefile != null) { uri imageuri = uri.fromfile(imagefile); log.d(tag, "imageuri received image: " + imageuri.tostring()); bufferedinputstream bufin = null; fileoutputstream output = null; bufin = new bufferedinputstream(input); output = new fileoutputstream(imagefile); byte[] buffer = new byte[1024]; int len; while((len = bufin.read(buffer)) != -1){ output.write(buffer); output.flush(); } output.close(); bufin.close(); log.d(tag, "image received , saved. file length: " + imagefile.length()); imageinfo info = new imageinfo(imageuri.tostring(), iscamera); bar = new bar(info); addnotification(bar, hostaddress); } else log.d(tag, "imagepicker.createfile returns null"); inputbufferedreader.close(); outputprintwriter.close(); } public file createfile(context context, boolean external, string ext) { file direct; if(external) direct = new file(environment.getexternalstoragedirectory() + "/myo_images"); else direct = new file(context.getfilesdir() + "/myo_images"); if (!direct.exists()) { file imagesdir; if(external) imagesdir = new file("/sdcard/myo_images/"); else imagesdir = new file("/myo_images"); imagesdir.mkdirs(); } string timestamp = new simpledateformat("yyyymmdd_hhmmss").format(new date()); file file = null; if(external) file = file.createtempfile("myo_" + timestamp, "." + ext, direct); else file = file.createtempfile("myo_" + timestamp, "." + ext, direct); return file; } } adapter class should visualize images
public class barscardviewadapter extends recyclerview.adapter<barscardviewadapter.cardviewholder> { private list<bardata> activebars; private final static string tag = "cardview_adapter"; public barscardviewadapter(list<bardata> bars){ activebars = bars; } public static class cardviewholder extends recyclerview.viewholder { private activebarslistitembinding listitembinding; public cardviewholder(view v) { super(v); listitembinding = databindingutil.bind(v); } public activebarslistitembinding getbinding(){ return listitembinding; } } @override public barscardviewadapter.cardviewholder oncreateviewholder(viewgroup parent, int viewtype) { view v = layoutinflater.from(parent.getcontext()) .inflate(r.layout.bars_list_item, parent, false); cardviewholder holder = new cardviewholder(v); return holder; } @override public void onbindviewholder(final barscardviewadapter.cardviewholder holder, final int position) { holder.getbinding().imageview.setvisibility(view.gone); final bar bar = activebars.get(position); final imageinfo imageinfo = bar.getimageinfo(); final linearlayout rlayout = holder.getbinding().listitemlayout; imageinfo imageinfo = bardata.getimageinfo(); log.d(tag, "imagepath: " + uri.parse(imageinfo.getpath())); holder.getbinding().imageview.setvisibility(view.visible); picasso.with(rlayout.getcontext()). load(imageinfo.getpath()). transform(new cropsquaretransformation()). into(holder.getbinding().imageview); holder.getbinding().setvariable(br.bar, bar); holder.getbinding().executependingbindings(); } @override public int getitemcount() { return activebars.size(); } }
you're trying read in binary data using reader converts bytes characters using kind of conversion in dependence of specified charset:
inputbufferedreader = new bufferedreader( new inputstreamreader(input)); this opens reader using system's charset (e.g. utf8 or cp1252)
instead of using reader , writer, work streams, in case bufferedinputstream , bufferedoutputstream , read/write blocks of bytes.
Comments
Post a Comment