Académique Documents
Professionnel Documents
Culture Documents
Neste curso, voce vai implementar um chat para app android e monitorar sua performance
usando o firebase.
O que você irá aprender:
● Permitir que o usuario se inscreva
● Sincronizar dados usando o Firebase REaltime Database
● Receber mensagens em background com Firebase Notiffications
● Configurar uma aplicaçãlo com Firebase Remote Config
● Testar seu app com o Firebase Test Lab
O que você vai precisar:
● Android Studio version 2.1+.
● Codigo de Exemplo
● Um device de teste com Android 2.3+ e Google Play services 9.8 ou mais atual, ou um
emulador com Google Play services 9.8 ou mais atual
● Se usar um device, um cabo de conexão
2- Baixar código de exemplo
https://drive.google.com/file/d/1ELHYP0PD7ChVG7n521_QDSrm9Q7erNMn/view?usp=shar
ing
3- No Android Studio, selecione android-start do download de codigos de exemplo
(File > Open > .../firebase-codelabs/android-start).
4- Crie um projeto no firebase console
1. Va ate o Firebase console.
2. Selecione Criar Novo Projeto,e nomeie seu projeto "FriendlyChat."
MainActivity.java
// Firebase instance variables
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
Importe mensagens
1. No seu projeto no console Firebase, selecione Database.
2. no menu overflow do Database, selecione Import JSON.
3. Navegue até o arquivo initial_messages.json na raiz do repositorio, e selecione-o.
4. Clique em Import.
Depois de importar o arquivo JSON, seu banco de dados deve se parecer com:
root
messages
-K2ib4H77rj0LYewF7dP
text: "hello"
name: "anonymous"
-K2ib5JHRbbL0NrztUfO
text: "how are you"
name: "anonymous"
-K2ib62mjHh34CAUbide
text: "i am fine"
name: "anonymous"
Depencias no app/build.gradle
compile 'com.google.firebase:firebase-database:11.8.0'
compile 'com.google.firebase:firebase-storage:11.8.0'
Sincronize menssagens
Adicione o codigo que sincroniza novas mensagens a UI do app.
Inicialize o Firebase Realtime Database e adicione umlistener para ratar as mudanças feitas
aos dados. Atualize o adaptador RecyclerView então novas mensagens poderão ser vistas.
Adicione a variavel Database na classe MainActivity:
MainActivity.java
// Firebase instance variables
private DatabaseReference mFirebaseDatabaseReference;
private FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>
mFirebaseAdapter;
MainActivity.java
// New child entries
mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
SnapshotParser<FriendlyMessage> parser = new SnapshotParser<F
riendlyMessage>() {
@Override
public FriendlyMessage parseSnapshot(DataSnapshot dataSnapshot) {
FriendlyMessage friendlyMessage =
dataSnapshot.getValue(FriendlyMessage.class);
if (friendlyMessage != null) {
friendlyMessage.setId(dataSnapshot.getKey());
}
return friendlyMessage;
}
};
DatabaseReference messagesRef =
mFirebaseDatabaseReference.child(MESSAGES_CHILD);
FirebaseRecyclerOptions<FriendlyMessage> options =
new FirebaseRecyclerOptions.Builder<FriendlyMessage>()
.setQuery(messagesRef, parser)
.build();
mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage,
MessageViewHolder>(options) {
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
return new MessageViewHolder(inflater.inflate(R.layout.item_message,
viewGroup, false));
}
@Override
protected void onBindViewHolder(final MessageViewHolder viewHolder,
int position,
FriendlyMessage friendlyMessage) {
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
if (friendlyMessage.getText() != null) {
viewHolder.messageTextView.setText(friendlyMessage.getText());
viewHolder.messageTextView.setVisibility(TextView.VISIBLE);
viewHolder.messageImageView.setVisibility(ImageView.GONE);
} else {
String imageUrl = friendlyMessage.getImageUrl();
if (imageUrl.startsWith("gs://")) {
StorageReference storageReference = FirebaseStorage.getInstance()
.getReferenceFromUrl(imageUrl);
storageReference.getDownloadUrl().addOnCompleteListener(
new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
String downloadUrl = task.getResult().toString();
Glide.with(viewHolder.messageImageView.getContext())
.load(downloadUrl)
.into(viewHolder.messageImageView);
} else {
Log.w(TAG, "Getting download url was not successful.",
task.getException());
}
}
});
} else {
Glide.with(viewHolder.messageImageView.getContext())
.load(friendlyMessage.getImageUrl())
.into(viewHolder.messageImageView);
}
viewHolder.messageImageView.setVisibility(ImageView.VISIBLE);
viewHolder.messageTextView.setVisibility(TextView.GONE);
}
viewHolder.messengerTextView.setText(friendlyMessage.getName());
if (friendlyMessage.getPhotoUrl() == null) {
viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MainActi
vity.this,
R.drawable.ic_account_circle_black_36dp));
} else {
Glide.with(MainActivity.this)
.load(friendlyMessage.getPhotoUrl())
.into(viewHolder.messengerImageView);
}
}
};
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
{
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});
mMessageRecyclerView.setAdapter(mFirebaseAdapter);
MainActivity.java
@Override
public void onPause() {
mFirebaseAdapter.stopListening();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
mFirebaseAdapter.startListening();
}
8. Envie Mensagens
Implemente o ennvio de mensagens
Nesta seção, você irá adicionar a funcionalidade de envio de mensagens para os usuários
do seu app. O trecho de código abaixo espera por eventos de cliques no botão de enviar, cria
um novo objeto FriendlyMessage com o conteúdo do campo de mensagem, e envia a
mensagem ao banco de dados. O método push() adiciona um id auto gerado ao caminho do
objeto enviado. Esses IDs são sequenciais o que garante que novas mensagenssejam
adicionadas ao fim da lista.
Atualize o método onClick de m
SendButton no método onCreate na classe M ainActivity.
Este código já está no fim do método o nCreate, atualize o corpo do o
nClick para encaixar
com o código abaixo:
MainActivity.java
mSendButton = (Button) findViewById(R.id.sendButton);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FriendlyMessage friendlyMessage = new
FriendlyMessage(mMessageEditText.getText().toString(),
mUsername,
mPhotoUrl,
null /* no image */);
mFirebaseDatabaseReference.child(MESSAGES_CHILD)
.push().setValue(friendlyMessage);
mMessageEditText.setText("");
}
});
Implemente o envio de imagens nas mensagens
Nesta seção, você irá adicionar a funcionalidade de envio de imagens no seu app. Os
passos para enviar uma imagem são os seguintes:
● Selecione uma imagem
● Controle a seleção da imagem
● Escreva a mensagem temporário no RTDB
● Inicie o upload da imagem selecionada
● Atualize a URL da mensagem para o da imagem upada, uma vez que o upload tenha
terminado
Selecione a imagem
Com o seguinte trecho de código, você vai permitir que usuário selecione uma imagem do
armazenamento local do seu aparelho. Atualize o método onClick de
mAddMessageImageView no método onCreate na classe MainActivity. Este código já está
no final do método o
nCreate, atualize o corpo do o
nClick para encaixar o código abaixo.
MainActivity.java
mAddMessageImageView = (ImageView) findViewById(R.id.addMessageImageView);
mAddMessageImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);
}
});
Controle a imagem selecionada escreva uma mensagem temporária
Uma vez que o usuário selecionou uma imagem, uma chamada ao método onActivityResult
da MainActivity será disparada. Isto é onde você controla a imagem selecionada pelo
usuário. Usando o trecho de código abaixo, e o método onActivityResult da MainActivity.
Nesta função você irá escrever uma url de mensagem temporária ao banco de dados
indicando que a imagem está sendo carregada.
MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" +
resultCode);
if (requestCode == REQUEST_IMAGE) {
if (resultCode == RESULT_OK) {
if (data != null) {
final Uri uri = data.getData();
Log.d(TAG, "Uri: " + uri.toString());