Send Image Using QuickBlox Chat SDK - Android

I am working on a chat application. For this I am using the Quickblox SDk. I have already done this with text chat. Now I am trying to send an image in the chat. To do this, first I select an image from the SD card, then select the image that it uploads to the quickblox server and using the QBFile link, I get the id of the image and try to show it in the chat window.

Here is the link code.

 private void sendChatMessage(String messageText, InputStream imageStream) {

    final QBChatMessage chatMessage = new QBChatMessage();

    //Send Image
    if(imageStream != null){
        File file = FileHelper.getFileInputStream(imageStream, "sample_file.png", "myFile");
        Boolean fileIsPublic = true;
        QBContent.uploadFileTask(file, fileIsPublic, messageText, new QBEntityCallbackImpl<QBFile>() {
            @Override
            public void onSuccess(QBFile qbFile, Bundle params) {

                String publicUrl = qbFile.getPublicUrl();
                Toast.makeText(getApplicationContext(), "Image uploaded success", Toast.LENGTH_SHORT).show();
                id = qbFile.getId();
                Toast.makeText(getApplicationContext(),"Public URl: "+ publicUrl, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(),"ID: "+ id + "", Toast.LENGTH_SHORT).show();

                //
                QBAttachment attach = new QBAttachment("image");
                attach.setId(id + "");
                ArrayList<QBAttachment> arryattach = new ArrayList<QBAttachment>();
                arryattach.add(attach);

                chatMessage.setProperty(PROPERTY_SAVE_TO_HISTORY, "1");
                chatMessage.setDateSent(new Date().getTime() / 1000);
                chatMessage.setBody("");
                chatMessage.setAttachments(arryattach);
                //chatMessage.setId(id+"");

                try {
                    chat.sendMessage(chatMessage);
                } catch (XMPPException e) {
                    Log.e(TAG, "failed to send a message", e);
                } catch (SmackException sme) {
                    Log.e(TAG, "failed to send a message", sme);
                }

                if (dialog.getType() == QBDialogType.PRIVATE) {
                    showMessage(chatMessage);
                }
            }
            @Override
            public void onError(List<String> errors) {
                System.out.println("==========image uploaded Errors++++++++" + errors.toString());
            }
        }, new QBProgressCallback(){
            @Override
            public void onProgressUpdate(int progress){
            }
        });

    }else{
        //Send Text Body.
        chatMessage.setBody(messageText);
        chatMessage.setProperty(PROPERTY_SAVE_TO_HISTORY, "1");
        chatMessage.setDateSent(new Date().getTime() / 1000);

        try {
            chat.sendMessage(chatMessage);
        } catch (XMPPException e) {
            Log.e(TAG, "failed to send a message", e);
        } catch (SmackException sme) {
            Log.e(TAG, "failed to send a message", sme);
        }

        messageEditText.setText("");

        if (dialog.getType() == QBDialogType.PRIVATE) {
            showMessage(chatMessage);
        }
    }

}

      

getView () ChatAdapter.java

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       final ViewHolder holder;
        QBChatMessage chatMessage = getItem(position);
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int type = getItemViewType(position) ;
        if (convertView == null) {

            if (type == ChatItemType.Sticker.ordinal()) {
                convertView = vi.inflate(R.layout.list_item_sticker, parent, false);
            } else if (type == ChatItemType.Message.ordinal()) {
                convertView = vi.inflate(R.layout.list_item_message, parent, false);
            } else {
                convertView = vi.inflate(R.layout.list_item_image, parent, false);
            }

            holder = createViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        QBUser currentUser = ChatService.getInstance().getCurrentUser();
        boolean isOutgoing = chatMessage.getSenderId() == null || chatMessage.getSenderId().equals(currentUser.getId());
        setAlignment(holder, isOutgoing);

        Collection<QBAttachment> attachments =  chatMessage.getAttachments();

        //attachments.
        if ( attachments != null && attachments.size() > 0) {

            String imageid="" ;
            for(QBAttachment attachment :attachments){
                imageid = attachment.getId();
            }
            new BackgroundOperation(holder ,imageid).execute();

        } else if (StickersManager.isSticker(chatMessage.getBody())) {
            StickersManager.with(convertView.getContext())
                    .loadSticker(chatMessage.getBody())
                    .setPlaceholderColorFilterRes(android.R.color.darker_gray)
                    .into(holder.stickerView);
        } else if (holder.txtMessage != null) {
            holder.txtMessage.setText(chatMessage.getBody());
        }

        if (chatMessage.getSenderId() != null) {
            holder.txtInfo.setText(chatMessage.getSenderId() + ": " + getTimeText(chatMessage));
        } else {
            holder.txtInfo.setText(getTimeText(chatMessage));
        }
        return convertView;
    }

    class BackgroundOperation extends AsyncTask<InputStream , Void , InputStream>{

       ViewHolder holder ;
       int imageid ;
       InputStream inputStream;

       BackgroundOperation(ViewHolder holder , String imageid){
           this.holder = holder ;
           this.imageid = Integer.parseInt(imageid);
       }

       @Override
       protected void onPreExecute() {
           super.onPreExecute();
       }

       @Override
       protected InputStream doInBackground(InputStream... params) {

           Handler mHandler = new Handler(Looper.getMainLooper());
               mHandler.post(new Runnable() {
                   public void run() {
                       QBContent.downloadFileTask(imageid, new QBEntityCallbackImpl<InputStream>() {
                           @Override
                           public void onSuccess(InputStream inputS, Bundle params) {

                               inputStream = inputS ;

                               //ImageView img =   holder.image_attachment ; //.setImageDrawable(d);
                               //Toast.makeText(context, "Image download Sucess", Toast.LENGTH_SHORT).show();

                           }

                           @Override
                           public void onError(List<String> errors) {
                               Log.d("Image Download Error : ", errors.toString());
                               //Toast.makeText(context, "Image Download Error ", Toast.LENGTH_SHORT).show();
                           }
                       }, new QBProgressCallback() {
                           @Override
                           public void onProgressUpdate(int progress) {
                               //Toast.makeText(context, "Image Download Progress ", Toast.LENGTH_SHORT).show();
                           }
                       });
                   }
               });

           return inputStream;
       }

       @Override
       protected void onPostExecute(InputStream s) {
           super.onPostExecute(s);

           if(s != null){
               Log.d("InputStream Value :", "******"+s.toString()+"******************");
               Bitmap bmp = BitmapFactory.decodeStream(s);
               Drawable d = new BitmapDrawable(context.getResources(), bmp);
               if(holder.image_attachment != null)
                   holder.image_attachment.setImageDrawable(d);
           }
       }
   }

      

Here I am calling the new BackgroundOperation (owner, imageid) .execute (); inside getView (). Here I am passing the current holder and imageid to download the image from the quickblox server. What happens here is when a new BackgroundOperation (owner, imageid) .execute () is executed ( after the image is loaded) then the doObackground () statement is not executed, even the image is loaded and I get the corresponding InputStream in onSuccess () from QBContent.downloadFileTask () . I am very confused that doInBackground () is not returning.

0


source to share


1 answer


Try this code:

Inside sendChatMessage

Replace

id = qbFile.getId();

      

FROM

id = qbFile.getUid();

      

Inside getView () from ChatAdapter.java



Replace

new BackgroundOperation(holder ,imageid).execute();

      

FROM

String url =prefixofimagePublicurl +imageid ;
Picasso.with(context).load(url).into(imageView);

      

Remove BackgroundOperation from ChatAdapter.java.

Note. Change data type imageid int ot String

0


source







All Articles