Enviando um sinal
Agora que você se conectou à sessão e possui um objeto de sessão, já pode enviar um Signal. Os Signals são textos ou dados arbitrários enviados em uma sessão, que podem ser direcionados a um cliente específico ou a todos os clientes conectados. Você pode saber mais sobre eles na Guia do desenvolvedor do Vonage Video Signaling. Neste tutorial, você enviará uma mensagem de texto.
- Crie uma nova classe chamada
SignalMessagecom este código:
public class SignalMessage {
private String messageText;
private Boolean remote;
public SignalMessage(String messageText) {
this.messageText = messageText;
this.remote = false;
}
public SignalMessage(String messageText, Boolean remote) {
this.messageText = messageText;
this.remote = remote;
}
public String getMessageText() {
return this.messageText;
}
public Boolean isRemote() {
return this.remote;
}
}
Essa classe será usada para exibir os sinais na interface do usuário.
- Copie o código a seguir e cole-o abaixo do código existente no seu
MainActivityaula depois daonCreatefunção:
private void sendMessage() {
Log.d(TAG, "Send Message");
String data = messageEditTextView.getText().toString();
session.sendSignal("msg", data);
SignalMessage message = new SignalMessage(data);
messageHistory.add(message);
messageEditTextView.setText("");
}
Este código adiciona uma função que será chamada a partir da interface do usuário. session.signal é chamado para enviar a mensagem pelo Signal. session.signal recebe o tipo do Signal e alguns dados. O tipo é opcional, mas pode ser usado para diferenciar os tipos de Signals em seu aplicativo. Se o Signal for enviado com sucesso, ele é adicionado à matriz de mensagens que a interface do usuário está utilizando.
- No
MainActivityclasse, atualize o final doonCreatefunção para adicionar um ouvinte aoEditTextViewque utiliza osendMessagefunção:
messageEditTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
InputMethodManager inputMethodManager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
sendMessage();
return true;
}
return false;
}
});
Quando o EditTextView emite uma ação de conclusão, o sendMessage A função será chamada. Agora é hora de atualizar a interface do usuário:
- Abra o
activity_main.xmlarquivo de layout (res > layout). - Abra a visualização do código.
- Copie este XML sobre o layout existente:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:keepScreenOn="true"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
tools:context=".MainActivity">
<ListView
android:id="@+id/message_history_list_view"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/message_edit_text"
android:transcriptMode="alwaysScroll"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/message_edit_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:enabled="false"
android:hint="Message"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1" />
</RelativeLayout>
- Crie um novo arquivo de layout chamado
message_single_local.xmlcom este XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Local Message"
android:id="@+id/message_text"
android:gravity="end"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp" />
</LinearLayout>
- Duplique o
message_single_local.xml, vamos chamá-lo demessage_single_remote.xml, e alterar a gravidade parastart. - Adicionar um adaptador para o histórico de mensagens
ListView, crie uma classe chamadaSignalMessageAdaptercom este código:
public class SignalMessageAdapter extends ArrayAdapter<SignalMessage> {
public static final int VIEW_TYPE_LOCAL = 0;
public static final int VIEW_TYPE_REMOTE = 1;
private static final Map<Integer, Integer> viewTypes;
static {
Map<Integer, Integer> aMap = new HashMap<>();
aMap.put(VIEW_TYPE_LOCAL, R.layout.message_single_local);
aMap.put(VIEW_TYPE_REMOTE, R.layout.message_single_remote);
viewTypes = Collections.unmodifiableMap(aMap);
}
public SignalMessageAdapter(Context context) {
super(context, 0);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SignalMessage message = getItem(position);
if (convertView == null) {
int type = getItemViewType(position);
convertView = LayoutInflater.from(getContext()).inflate(viewTypes.get(type), null);
}
TextView messageTextView = (TextView) convertView.findViewById(R.id.message_text);
if (messageTextView != null) {
messageTextView.setText(message.getMessageText());
}
return convertView;
}
@Override
public int getItemViewType(int position) {
SignalMessage message = getItem(position);
return message.isRemote() ? VIEW_TYPE_REMOTE : VIEW_TYPE_LOCAL;
}
@Override
public int getViewTypeCount() {
return viewTypes.size();
}
}
Os adaptadores são usados para preencher as visualizações em um ListView, isso define uma classe personalizada para os Signals. Certifique-se de importar todas as classes necessárias.
Bate-papo básico por texto
Siga este tutorial para criar um chat de texto básico do zero usando a Video API da Vonage. Essa é a maneira mais rápida de desenvolver uma prova de conceito para essa funcionalidade na plataforma de vídeo.