Click here to Skip to main content
14,267,453 members
   

Android

 
QuestionImage Transfer from Raspberry Pi (in Python) to Android app (Java) Pin
Member 1453729921-Jul-19 19:57
memberMember 1453729921-Jul-19 19:57 
I have set up a client-server architecture such that my raspberry pi 3 records audio, performs some analysis on it, and then sends the data (via TCP) to the android app to display on the app screen. The recording and analysis is done and I am able to make the connection and transfer string data that displays on the app with no problem. However, I have been unsuccessful in transferring an image from rpi to android app. So basically, the image is stored on the rpi and I an attempting to transfer the image to the app to display it. I have been working on this for over a week with no luck so any help would be greatly appreciated!

My current implementation (all code provided below): 

On rpi (python): Like I said, sending strings and displaying them on the android app is done without any problem. When I am sending the image portion of the audio analysis, I send a string first that says "?start" so that the android side knows that an image instead of a string is about to be sent (and will wait to update the GUI until it receives the entire image). Then, I open the image stored on rpi and read the entire image as a byte array (typically about 40-50k bytes). I get the length of the byte array and send that as a string to android app. Finally, I send the byte array to the android and it waits for an OK message from the app. All of this works without reporting any errors. 

On android app (java): When the app receives the "?start" string, it then uses a Buffered Reader (which is what I used to read the string data I had transferred to the app successfully earlier) to read the size of the image byte array. Then, I create 2 buffers, msg_buff and img_buff. msg_buff will read in 1024 bytes at a time while img_buff will hold the entire byte array of the image. In the infinite while loop, I have a DataInputStream, called in, read bytes into msg_buff and returns the number of bytes read. Then, I concatenate the copied contents of msg_buff into img_buff. Once the bytes read from in is -1 or the img_offset (which is just the total number of bytes read) is greater than or equal to the size of the image bytes array, the while loop is broken. Then, I would attempt to save the image to android internal storage and then load it later to an imageView to display it. This code does successfully read in the bytes until there are around 2000-3000 bytes left to be read and then it seems to freeze on the int bytes_read = in.read(msg_buff, 0, msg_buff.length) line. I have not been able to get past that point so I do not know if saving the image to internal storage and then loading it to imageview that way will work either. 

I have also tried using base64 encoding/decoding but that also kept producing errors. I have tried rpi only sending 1024 bytes of the image at a time but that also did not work. I have tried several implementations of this approach but nothing has worked so far. If anyone sees anything wrong or has another approach, I am all ears!

Android Studio (app side):

//receives the message which the server sends back
InputStream sin = socket.getInputStream();
OutputStream sout = socket.getOutputStream();
DataInputStream in = new DataInputStream(sin);

mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//in this while the client listens for the messages sent by the server
while (mRun) {

    mServerMessage = mBufferIn.readLine();

    if (mServerMessage != null && mMessageListener != null) {

           //Check if data is image
           if(mServerMessage.equals("?start"))
           {

                 // Get length of image byte array
                 int size = Integer.parseInt(mBufferIn.readLine());

                 // Create buffers
                 byte[] msg_buff = new byte[1024];
                 byte[] img_buff = new byte[size];
                 int img_offset = 0;

                 while(true){
                    int bytes_read = in.read(msg_buff, 0, msg_buff.length);

                    if(bytes_read == -1){ break; }

                    //copy bytes into img_buff
                    System.arraycopy(msg_buff, 0, img_buff, img_offset, bytes_read);
                    img_offset += bytes_read;

                    if( img_offset >= size) { break; }

                 }

                 ContextWrapper cw = new ContextWrapper(ApplicationContextProvider.getContext());
                 File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
                 File mypath = new File(directory, "signal.jpeg");

                 Bitmap bitmap = BitmapFactory.decodeByteArray(img_buff, 0, img_buff.length);
                 FileOutputStream fos = null;

                 try{
                    fos = new FileOutputStream(mypath);

                    //Use compress method on Bitmap object to write image to OutputStream
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

                    //Send OK
                    byte[] OK = new byte[] {0x4F, 0x4B};
                    sout.write(OK);

                 } catch (Exception e) {
                    e.printStackTrace();
                 }

Raspberry Pi (python):

def image_to_byte_array(image_file, conn):
    with open(image_file, 'rb') as imageFile:
         content = imageFile.read()
         conn.sendall("?start\n".encode('utf-8'))
         size = len(content)
         strSize = str(size) + "\n"
         conn.sendall(strSize.encode('utf-8'))
         conn.sendall(content)

Note that conn is the connection between the app and the rpi and the images are PNG.
If anyone knows why this isn't working or has a better way for me to do this, I would greatly appreciate it!! Thank you in advance!! :) 

AnswerRe: Image Transfer from Raspberry Pi (in Python) to Android app (Java) Pin
Richard MacCutchan21-Jul-19 21:29
protectorRichard MacCutchan21-Jul-19 21:29 
Questionpython Pin
Member 1453431517-Jul-19 23:25
memberMember 1453431517-Jul-19 23:25 
AnswerRe: python Pin
Richard MacCutchan18-Jul-19 0:37
protectorRichard MacCutchan18-Jul-19 0:37 
AnswerRe: python Pin
Afzaal Ahmad Zeeshan18-Jul-19 0:56
mveAfzaal Ahmad Zeeshan18-Jul-19 0:56 
QuestionQR camera scan with android phone using C# Pin
A.Shoman15-Jul-19 21:04
memberA.Shoman15-Jul-19 21:04 
AnswerRe: QR camera scan with android phone using C# Pin
Richard MacCutchan15-Jul-19 21:15
protectorRichard MacCutchan15-Jul-19 21:15 
QuestionMessage Closed Pin
5-Jul-19 1:29
memberlucaxhenderson5-Jul-19 1:29 
Questiondownload sound file in android webview Pin
Member 1450174330-Jun-19 23:00
memberMember 1450174330-Jun-19 23:00 
QuestionRe: download sound file in android webview Pin
David Crow3-Jul-19 4:11
memberDavid Crow3-Jul-19 4:11 
AnswerRe: download sound file in android webview Pin
Member 145017433-Jul-19 4:27
memberMember 145017433-Jul-19 4:27 
QuestionCan't make charge with stripe in android Fire base Pin
Saboor880220-Jun-19 6:21
memberSaboor880220-Jun-19 6:21 
SuggestionRe: Can't make charge with stripe in android Fire base Pin
David Crow21-Jun-19 3:08
memberDavid Crow21-Jun-19 3:08 
QuestionAll record from SQLite DB is not inserting properly by using PHP and Android. Loop is not working. Pin
PRASANTA KUMAR BISWAS5-May-19 19:33
memberPRASANTA KUMAR BISWAS5-May-19 19:33 
SuggestionRe: I am unable to send SQLite data(multiple record) to SQL server 2005 database by using PHP and Android Pin
Richard MacCutchan5-May-19 21:55
protectorRichard MacCutchan5-May-19 21:55 
GeneralRe: I am unable to send SQLite data(multiple record) to SQL server 2005 database by using PHP and Android Pin
PRASANTA KUMAR BISWAS5-May-19 23:41
memberPRASANTA KUMAR BISWAS5-May-19 23:41 
GeneralRe: I am unable to send SQLite data(multiple record) to SQL server 2005 database by using PHP and Android Pin
Richard MacCutchan5-May-19 23:51
protectorRichard MacCutchan5-May-19 23:51 
SuggestionRe: All record from SQLite DB is not inserting properly by using PHP and Android. Loop is not working. Pin
Richard Deeming8-May-19 1:34
mveRichard Deeming8-May-19 1:34 
Questionno database data after depolyment Pin
Wiep Corbier29-Apr-19 21:54
memberWiep Corbier29-Apr-19 21:54 
AnswerRe: no database data after depolyment Pin
Richard MacCutchan29-Apr-19 22:43
protectorRichard MacCutchan29-Apr-19 22:43 
GeneralRe: no database data after depolyment Pin
Wiep Corbier29-Apr-19 23:16
memberWiep Corbier29-Apr-19 23:16 
GeneralRe: no database data after depolyment Pin
Wiep Corbier30-Apr-19 7:29
memberWiep Corbier30-Apr-19 7:29 
GeneralRe: no database data after depolyment Pin
Mycroft Holmes30-Apr-19 12:31
memberMycroft Holmes30-Apr-19 12:31 
GeneralRe: no database data after depolyment Pin
Wiep Corbier1-May-19 8:10
memberWiep Corbier1-May-19 8:10 
AnswerMessage Closed Pin
18-Jun-19 20:02
memberMember 1450266718-Jun-19 20:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.