무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
강의하시는 파이어베이스 버젼이 얼마인지요 ..
현재 최신버젼은 9 이더군요
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
강의 잘 듣고 있습니다. 그런데 getString이....
강의 잘 듣고 있습니다. 그런데 getString에 문제가 생겼습니다. 어디서 잘 못된건지 모르겠습니다. loginActivity에서 이런 문제가 발생하여 결과값이 잘 되는지 볼 수가 없습니다. 무엇이 잘못된 건가요?
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
ChatModel에서 comment 해시맵에서 키로 String을 넣으신 이유가 따로 있나요?? comment함수만으로도 될 거 같은데
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
1강부터 매개변수 서버에서 받아오는거 막혀서 고생했는데
에뮬에서 앱 지우고 다시 run하니까 서버에서 받아와지네요 5시간 넘게 구글링하고 이것저것 고쳐봐도 안되던거.. 참 이거랑 비슷한거 겪으신분은 고생 안하셧으면 ㅠㅠ
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
파이어베이스 임포트 할때 저는 자동으로 임포트가 되지 않습니다.
리모트 컨피그 세팅하실 때, 코드를 넣으면 영상에서는 자동으로 임포트가 되는데 제 맥에서는 자동으로 임포트가 되지 않습니다. 어떻게 해야하나요 ?
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
급히 질문드립니다ㅠㅠ
FirebaseAuth.getInstance().createUserWithEmailAndPassword(Id.getText().toString(), pw2.getText().toString()).addOnCompleteListener(SignUp.this, new OnCompleteListener() {@Overridepublic void onComplete(@NonNull Task task) {final String uid = task.getResult().getUser().getUid(); FirebaseStorage.getInstance().getReference().child("userImages").child(uid).putFile(imageURI1).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { String imageUri1=task.getResult().getUploadSessionUri().toString(); /*String imageUri2=task.getResult().getUploadSessionUri().toString(); String imageUri3=task.getResult().getUploadSessionUri().toString();*/ if (task.isSuccessful()) { UserModel userModel = new UserModel(); userModel.userName = name.getText().toString(); userModel.userAge = age.getText().toString(); userModel.userSNS = sns.getText().toString(); userModel.userSex = sex; userModel.uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); userModel.profileImage1=imageUri1; /*userModel.profileImage2=imageUri2; userModel.profileImage3=imageUri3;*/ FirebaseDatabase.getInstance().getReference().child("users").child(uid).setValue(userModel).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Toast.makeText(SignUp.this, "Travel Maekr에 가입되셨습니다.", Toast.LENGTH_SHORT).show(); SignUp.this.finish(); } }); } else { Toast.makeText(SignUp.this, "이메일이 존재하지 않거나 형식이 올바르지 않습니다.", Toast.LENGTH_SHORT).show(); return; } } }); } }); } }});안녕하세요ㅠㅠ 도저히 해결 방법을 모르겠어서 질문드립니다.다른코드는 다 정상 작동 하는데 토스트메시지로 한번 확인해본결과 정확히FirebaseDatabase.getInstance().getReference().child("users").child(uid).setValue(userModel).addOnSuccessListener(new OnSuccessListener() {@Overridepublic void onSuccess(Void aVoid) {Toast.makeText(SignUp.this, "Travel Maekr에 가입되셨습니다.", Toast.LENGTH_SHORT).show();SignUp.this.finish();}});이부분만 코드가 안먹는거같아요 파이어베이스 데이터베이스값에 계속 값이 들어가질 않네요…뭐가문제인지 혹시 알수 있을까요? 가입되었다는 토스트메시지를 밖으로 빼면 토스트메시지는 띄워지는걸로 보아 그냥 저 디비에 값넣는거 자체가 안먹는거 같아요
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
getDownloadUrl
안녕하세요. 강의 잘 보고 있습니다.그런데 여기서 getDownloadUrl이 버전이 바뀌어서 안되는 것 같은데혹시 해결책을 알고 계신가요?
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
Comment가 안 만들어집니다.
```package com.example.jun.myeongjuntalk.chat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import com.example.jun.myeongjuntalk.R;import com.example.jun.myeongjuntalk.model.ChatModel;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.database.DataSnapshot;import com.google.firebase.database.DatabaseError;import com.google.firebase.database.FirebaseDatabase;import com.google.firebase.database.ValueEventListener;public class MessageActivity extends AppCompatActivity {private String destinationUid;private EditText editText;private String uid,chatRoomUid;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); uid = FirebaseAuth.getInstance().getCurrentUser().getUid();//채팅을 요구한 아이디, 즉 사용자 본인 단말기 아이디 destinationUid = getIntent().getStringExtra("destinationUid");//채팅을 당하는 아이디 Button button = (Button) findViewById(R.id.meesage_btn); editText = (EditText)findViewById(R.id.message_edt); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ChatModel chatModel = new ChatModel(); chatModel.users.put("uid",true); chatModel.users.put("destinationUid",true); if(chatRoomUid == null){ Log.d(null,"되냐"); FirebaseDatabase.getInstance().getReference().child("chattingRoom").push().setValue(chatModel); } else{ Log.d(null,"되냐2"); ChatModel.Comment comment = new ChatModel.Comment(); comment.uid = uid; comment.message = editText.getText().toString(); FirebaseDatabase.getInstance().getReference().child("chattingRoom").child(chatRoomUid).child("comments").push().setValue(comment); } } }); checkRoom();}void checkRoom(){ Log.d(null,"checkRoom"); //중복 FirebaseDatabase.getInstance().getReference().child("chattingRoom").orderByChild("users/"+uid).equalTo(true).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot item : dataSnapshot.getChildren()){ ChatModel chatModel = item.getValue(ChatModel.class); //채팅방 테이블에 사용자와 대화상대의 uid를 가져옴 if(chatModel.users.containsKey(destinationUid)){ chatRoomUid = item.getKey(); } } } @Override public void onCancelled(DatabaseError databaseError) { } });}}이 코드로 했을 때 , comment가 안 만들어집니다. 제가 볼 때는 elss 문이 실행이 안되는 거 같습니다. chattingRoomId값을 가져와도 자꾸 널 값으로 되서 자꾸 if문만 실행됩니다.
- 미해결Firebase 서버를 통한 Android앱 HowlTalk 만들기
푸시 메시지 추가후 에러 문제
안녕하세요 강의 잘 듣고 있습니다 ㅎㅎ푸쉬 메시지를 추가하고 나서 에러 구문이 생겨 난 것 같은데 어디가 문제인지 잘 모르겠네요E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE이 구문이 주기적으로 생성되고 있었습니다.그리고 추가적으로 database에도 값들이 올라가지 않게 된 것 같네요 ㅠㅠ순서대로 manifest, messageActivity, signUpActivity 입니다'''<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.solive.knuprime031.knurun"><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".SplashActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".loginActivity" /> <activity android:name=".signUpActivity" /> <activity android:name=".MainActivity" /> <activity android:name=".chat.MessageActivity" /> <!--<activity android:name=".SignUpActivity" />--> <!--<activity android:name=".RequestCreateActivity" />--> <activity android:name=".RequestCreateActivity"></activity> <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service></application> ''''''package com.solive.knuprime031.knurun.chat;import android.support.annotation.NonNull;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import com.bumptech.glide.Glide;import com.bumptech.glide.request.RequestOptions;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.database.DataSnapshot;import com.google.firebase.database.DatabaseError;import com.google.firebase.database.FirebaseDatabase;import com.google.firebase.database.ServerValue;import com.google.firebase.database.ValueEventListener;import com.google.gson.Gson;import com.solive.knuprime031.knurun.R;import com.solive.knuprime031.knurun.model.ChatModel;import com.solive.knuprime031.knurun.model.NotificationModel;import com.solive.knuprime031.knurun.model.UserModel;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.TimeZone;import okhttp3.Call;import okhttp3.Callback;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class MessageActivity extends AppCompatActivity {private String destinationUid;private Button button;private EditText editText;private String uid;private String chatRoomUid;private RecyclerView recyclerView;private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm");private UserModel destinationUserModel;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); destinationUid = getIntent().getStringExtra("destinationUid"); recyclerView = (RecyclerView)findViewById(R.id.messageActivity_recyclerView); button = (Button)findViewById(R.id.messageActivity_button); editText = (EditText)findViewById(R.id.messageActivity_edtiText); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ChatModel chatModel = new ChatModel(); chatModel.users.put(uid,true); chatModel.users.put(destinationUid, true); if(chatRoomUid == null) { button.setEnabled(false); Toast.makeText(MessageActivity.this, "Success", Toast.LENGTH_SHORT).show(); FirebaseDatabase.getInstance().getReference().child("chatrooms").push().setValue(chatModel).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { checkChatRoom(); } }); } else { ChatModel.Comment comment = new ChatModel.Comment(); comment.uid = uid; comment.message = editText.getText().toString(); comment.timeStamp = ServerValue.TIMESTAMP; FirebaseDatabase.getInstance().getReference().child("chatrooms").child(chatRoomUid).child("comments").push().setValue(comment).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { sendGcm(); editText.setText(""); } }); } } }); checkChatRoom();}void sendGcm() { Gson gson = new Gson(); String userName = FirebaseAuth.getInstance().getCurrentUser().getDisplayName(); NotificationModel notificationModel = new NotificationModel(); notificationModel.to = destinationUserModel.pushToken; notificationModel.notification.text = userName; notificationModel.notification.title = editText.getText().toString(); notificationModel.data.text = userName; notificationModel.data.title = editText.getText().toString(); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utp8"), gson.toJson(notificationModel)); Request request = new Request.Builder() .header("Content-Type","application/json") .addHeader("Authorization","key=AIzaSyBNM5T3oCs_4gxClchRYvXbBQHdtCnw5Hc") .url("https://gcm-http.googleapis.com/gcm/send") .post(requestBody) .build(); OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } });}void checkChatRoom() { FirebaseDatabase.getInstance().getReference().child("chatrooms").orderByChild("users/"+uid).equalTo(true).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot item : dataSnapshot.getChildren()) { ChatModel chatModel = item.getValue(ChatModel.class); if(chatModel.users.containsKey(destinationUid)) { chatRoomUid = item.getKey(); button.setEnabled(true); recyclerView.setLayoutManager(new LinearLayoutManager(MessageActivity.this)); recyclerView.setAdapter(new RecyclerViewAdapter()); } } } @Override public void onCancelled(DatabaseError databaseError) { } });}class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { List<ChatModel.Comment> comments; public RecyclerViewAdapter() { comments = new ArrayList<>(); FirebaseDatabase.getInstance().getReference().child("users").child(destinationUid).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { destinationUserModel = dataSnapshot.getValue(UserModel.class); getMessageList(); } @Override public void onCancelled(DatabaseError databaseError) { } }); } void getMessageList() { FirebaseDatabase.getInstance().getReference().child("chatrooms").child(chatRoomUid).child("comments").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { comments.clear(); for (DataSnapshot item : dataSnapshot.getChildren()) { comments.add(item.getValue(ChatModel.Comment.class)); } notifyDataSetChanged(); recyclerView.scrollToPosition(comments.size()-1); } @Override public void onCancelled(DatabaseError databaseError) { } }); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message, parent, false); return new MessageViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MessageViewHolder messageViewHolder = ((MessageViewHolder)holder); if(comments.get(position).uid.equals(uid)) { messageViewHolder.textView_message.setText(comments.get(position).message); messageViewHolder.textView_message.setBackgroundResource(R.drawable.rightbubble); messageViewHolder.linearLayout_destination.setVisibility(View.INVISIBLE); messageViewHolder.textView_message.setTextSize(25); messageViewHolder.linearLayout_main.setGravity(Gravity.RIGHT); } else { Glide.with(holder.itemView.getContext()) .load(destinationUserModel.profileImageUrl) .apply(new RequestOptions().circleCrop()) .into(messageViewHolder.imageView_profile); messageViewHolder.textView_name.setText(destinationUserModel.userName); messageViewHolder.linearLayout_destination.setVisibility(View.VISIBLE); messageViewHolder.textView_message.setBackgroundResource(R.drawable.leftbubble); messageViewHolder.textView_message.setText(comments.get(position).message); messageViewHolder.textView_message.setTextSize(25); messageViewHolder.linearLayout_main.setGravity(Gravity.LEFT); } long unixTime = (long)comments.get(position).timeStamp; Date date = new Date(unixTime); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul")); String time = simpleDateFormat.format(date); messageViewHolder.textView_time_stamp.setText(time); } @Override public int getItemCount() { return comments.size(); } private class MessageViewHolder extends RecyclerView.ViewHolder { public TextView textView_message; public TextView textView_name; public ImageView imageView_profile; public LinearLayout linearLayout_destination; public LinearLayout linearLayout_main; public TextView textView_time_stamp; public MessageViewHolder(View view) { super(view); textView_message = (TextView) view.findViewById(R.id.messageItem_textView_message); textView_name = (TextView)view.findViewById(R.id.messageItem_textView_name); imageView_profile = (ImageView)view.findViewById(R.id.messageItem_imageView_profile); linearLayout_destination = (LinearLayout)view.findViewById(R.id.messageItem_linearLayout_destinaiton); linearLayout_main = (LinearLayout)view.findViewById(R.id.messageItem_linearLayout_main); textView_time_stamp = (TextView)view.findViewById(R.id.messageItem_textView_timeStamp); } }}@Overridepublic void onBackPressed() { finish(); overridePendingTransition(R.anim.fromleft, R.anim.toright);}}''''''package com.solive.knuprime031.knurun;import android.content.Intent;import android.graphics.Color;import android.net.Uri;import android.os.Build;import android.provider.MediaStore;import android.support.annotation.NonNull;import android.support.annotation.RequiresApi;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.AuthResult;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.UserProfileChangeRequest;import com.google.firebase.database.FirebaseDatabase;import com.google.firebase.remoteconfig.FirebaseRemoteConfig;import com.google.firebase.storage.FirebaseStorage;import com.google.firebase.storage.UploadTask;import com.solive.knuprime031.knurun.model.UserModel;public class signUpActivity extends AppCompatActivity {private EditText email;private EditText name;private EditText password;private Button signup;private String splash_background;private ImageView profile;private Uri imageUri;private static final int PICK_FROM_ALBUM = 10;@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_up); FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); splash_background = mFirebaseRemoteConfig.getString(getString(R.string.rc_color)); getWindow().setStatusBarColor(Color.parseColor(splash_background)); profile = (ImageView)findViewById(R.id.signUpActivity_imageView_profile); profile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(MediaStore.Images.Media.CONTENT_TYPE); startActivityForResult(intent,PICK_FROM_ALBUM); } }); email = (EditText)findViewById(R.id.signUpActivity_editText_email); name = (EditText)findViewById(R.id.signUpActivity_editText_name); password = (EditText)findViewById(R.id.signUpActivity_editText_password); signup = (Button)findViewById(R.id.signUpActivity_button_signUp); signup.setBackgroundColor(Color.parseColor(splash_background)); signup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (email.getText().toString() == null || name.getText().toString() == null || password.getText().toString() == null || imageUri == null) { Toast.makeText(signUpActivity.this, "NULL", Toast.LENGTH_SHORT).show(); return; } FirebaseAuth.getInstance(). createUserWithEmailAndPassword(email.getText().toString(), password.getText().toString()) .addOnCompleteListener(signUpActivity.this, new OnCompleteListener<AuthResult>() { public void onComplete(@NonNull Task<AuthResult> task) { final String uid = task.getResult().getUser().getUid(); UserProfileChangeRequest userProfileChangeRequest = new UserProfileChangeRequest.Builder().setDisplayName(name.getText().toString()).build(); task.getResult().getUser().updateProfile(userProfileChangeRequest); FirebaseStorage.getInstance().getReference().child("userImages").child(uid).putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { @SuppressWarnings("VisibleForTests") String imageUrl = task.getResult().getDownloadUrl().toString(); UserModel userModel = new UserModel(); userModel.userName = name.getText().toString(); userModel.profileImageUrl = imageUrl; userModel.uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); Toast.makeText(signUpActivity.this, "Try", Toast.LENGTH_SHORT).show(); FirebaseDatabase.getInstance().getReference().child("users").child(uid).setValue(userModel).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { signUpActivity.this.finish(); } }); } }); } }); } });}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==PICK_FROM_ALBUM && resultCode==RESULT_OK) { profile.setImageURI(data.getData()); imageUri = data.getData(); }}} '''