마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드스튜디오) ibm watson chatbot , 챗봇이 이미지로 응답하기

0 추천
// Sending a message to Watson Conversation Service
private void sendMessage() {

        final String inputmessage = this.inputMessage.getText().toString().trim();
        if(!this.initialRequest) {
            Message inputMessage = new Message();
            inputMessage.setMessage(inputmessage);
            inputMessage.setId("1");
            messageArrayList.add(inputMessage);
        }
        else
        {
            Message inputMessage = new Message();
            inputMessage.setMessage(inputmessage);
            inputMessage.setId("100");
            this.initialRequest = false;
            Toast.makeText(getApplicationContext(),"Tap on the message for Voice",Toast.LENGTH_LONG).show();

        }

        this.inputMessage.setText("");
        mAdapter.notifyDataSetChanged();

        Thread thread = new Thread(new Runnable(){
            public void run() {
                try {

        Assistant assistantservice = new Assistant("2018-02-16");
        //If you like to use USERNAME AND PASSWORD
        //Your Username: "apikey", password: "<APIKEY_VALUE>"
        assistantservice.setUsernameAndPassword("apikey", "api");

        //TODO: Uncomment this line if you want to use API KEY
        //assistantservice.setApiKey("<API_KEY_VALUE>");

        //Set endpoint which is the URL. Default value: https://gateway.watsonplatform.net/assistant/api
        assistantservice.setEndPoint("https://api.kr-seo.assistant.watson.cloud.ibm.com/instances/2asdfasdf");
        InputData input = new InputData.Builder(inputmessage).build();
        //WORKSPACES are now SKILLS
        MessageOptions options = new MessageOptions.Builder().workspaceId("asdf").input(input).context(context).build();
        MessageResponse response = assistantservice.message(options).execute();
                    Log.i(TAG, "run: "+response);

                    String outputText = "";
                    int length=response.getOutput().getText().size();
                    Log.i(TAG, "run: "+length);
                    if(length>1) {
                        for (int i = 0; i < length; i++) {
                            outputText += '\n' + response.getOutput().getText().get(i).trim();
                        }
                    }
                    else
                       outputText = response.getOutput().getText().get(0);

                    Log.i(TAG, "run: "+outputText);
               //Passing Context of last conversation
                if(response.getContext() !=null)
                    {
                        //context.clear();
                        context = response.getContext();

                    }
        Message outMessage=new Message();
          if(response!=null)
          {
              if(response.getOutput()!=null && response.getOutput().containsKey("text"))
              {
                  ArrayList responseList = (ArrayList) response.getOutput().get("text");
                  if(null !=responseList && responseList.size()>0){
                      outMessage.setMessage(outputText);
                      outMessage.setId("2");
                  }
                  messageArrayList.add(outMessage);
              }

              runOnUiThread(new Runnable() {
                  public void run() {
                      mAdapter.notifyDataSetChanged();
                     if (mAdapter.getItemCount() > 1) {
                          recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount()-1);

                      }

                  }
              });


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

        thread.start();

ibm 웹에서는 이미지가 잘 보입니다. 근데 안드로이드 스튜디오로 하면 text는 출력이 잘되는데 이미지가 출력이 되지않습니다. 

 

도와주십시오...

 

https://open.kakao.com/o/sKAhDlEc

 

https://github.com/IBM-Cloud/chatbot-watson-android

자세한 코드입니다....

 

 

최고가되고싶은개발자 (400 포인트) 님이 2020년 10월 31일 질문
최고가되고싶은개발자님이 2020년 10월 31일 수정
아무리 봐도 이미지를 보여주는 코드가 없는데, 이미지가 안 나오면 맞는거 아닌가요?
아마 챗봇이 이미지를 uri로 리턴시키고 uri를 glide라이브러리 로 출력하라는데 할줄을 모르겠어요.... 코드 뭘 추가시켜야하는지를 모르겠습니다...ㅠ

1개의 답변

+1 추천
 
채택된 답변

Glide 홈페이지나 Github 사이트 가시면 사용법이 자세하게 나오는데요. 가장 심플하게는
Glide.with(fragment)
    .load(myUrl)
    .into(imageView);

를 사용하시며 될 것 같네요. 님의 코드에서는 아마도

List<ChatMessage> messages = getChatMessages(response);

runOnUiThread(new Runnable() {
                  public void run() {
                      mAdapter.setItems(items); //어댑터에 텍스트와 이미지 URL을 가진 데이터를 넣어준다.
                      mAdapter.notifyDataSetChanged();
                     if (mAdapter.getItemCount() > 1) {
                          recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount()-1);
 
                      }
 
                  }
              });



public class ChatMessage {
    private final Message message;
    private final String imageUrl;

   public ChatMessage(Message message, String imageUrl) {
         this.message = message;
         this.imageUrl = imageUrl;
   }
}

private List<ChatMessage> getChatMessages(MessageResponse response) {
    ///텍스트와 이미지 URL 리스트를 에서 축출하세요. 텍스트 메세지는 이미 하신 듯하니 그 부분과 
    // 이미지 URL을 가져오는 부분을 여기에 구현하세요. 
}

부분에서 리사이클러뷰에 필요한 데이터를 넣어주시면 될 것 같네요. RecyclerView의 ViewHolder에서는 layout에 ImageView를 하나 추가하시고 Adapter의 onBindViewHolder에서 ChatMessage와 binding을 해주세요. 그리고 ViewHolder에서는 위에서 언급한 Glide API를 사용해서 이미지를 URL로 부터 가져오면 됩니다.

//Adapter class

private List<ChatMessage> items;

private ChatMessage getItem(int position) {
     return items.get(position);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
      holder.bind(getItem(position));
}


//ViewHolder
class MyViewHolder(itemView: View) extends ViewHolder(itemView) {

    private ImageView imageView = itemView.findViewById(...);

    public void bind(ChatMessage message) {
          Glide.with(itemView.Context)
                  .load(message.getImageUrl())
                  .into(imageView);
    }

}

님이 사용하시는 데이터 구조도 알 수 가 없고 왓슨이 어떻게 데이터를 리턴하는지도 모르기 때문에 이 이상의 내용은 알려 드리기 어려울 것 같습니다.  나머지 부분은 님이 어렵지 않게 하실 수 있으리라 생각합니다.

 

spark (227,470 포인트) 님이 2020년 10월 31일 답변
최고가되고싶은개발자님이 2020년 10월 31일 채택됨
와 감사합니다!!!!...

 님 혹시 오픈채팅방 으로 연락주실수있을까요???
죄송하지만, 채팅까지하는 것은 제가 님의 프로젝트에 관여하는 게 된다고 생각되어서 사양하겠습니다. 나머지는 부분은 님의 몫입니다. 만약, 추가로 필요한 질문이 있으시다면 하시면 됩니다. 저는 제 코드가 님의 프로젝트에 그대로 쓰이길 원치는 않습니다. 다만 아이디어만 제공해 드리고 싶은거죠.
리사이클러뷰는 안드로이드 굉장히 자주 쓰이는 컴포넌트입니다. 안드로이드 개발자 문서에서 리사이클러뷰에 대해 찾아보시고, Volley에 대해서도 해당 사이트에서 어떻게 사용하는지 먼저 문서를 읽어 보시고 난 다음 코딩을 하시기를 권장드립니다. 이게 처음에는 더디지만 결과적으로는 더 빠르고 더 좋은 코드를 짤 수 있는 방법입니다.
아 제가 경솔치 못했네요 죄송합니다.

진짜 죄송한데 여기에 필요한 함수나 라이브러리 설명해주실수있을까요???
님이 링크 올리신 Github에 이미 완전한 앱소스가 올라가 있네요. 그거 보고 거의 그대로 가져다 쓰시면 될 것 같은데여, 이건 확인을 못하신 건가요?
당연히 확인은 했죠... 챗봇처럼 작동은잘하는데 ibm assistant에 입력을 하면 웹에서는 잘되지만 안드로이드스튜디오에서는 텍스트는 열심히 리턴이 잘되는데 이미지 만리턴이 안되서 그걸질문에 올린겁니다.  그부분만 하면되는데 도통감이 안잡히네요..
서버에서 이미지 데이터가 리턴이 안되는 거라면, 이건 왓슨 쪽에 문의를 하셔야 답을 얻을 수 있지 않나요?
아 찾아보니 assistant를 v2로 마이그레이션 해야되네요....
...