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

Popular posts from this blog

neo4j - finding mutual friends in a cypher statement starting with three or more persons -

php - How to remove letter in front of the word laravel -

minify - Minimizing css files -