-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
미해결
푸시 메시지 추가후 에러 문제
18.05.06 22:12 작성 조회수 146
0
안녕하세요 강의 잘 듣고 있습니다 ㅎㅎ
푸쉬 메시지를 추가하고 나서 에러 구문이 생겨 난 것 같은데 어디가 문제인지 잘 모르겠네요
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;
@Override
protected 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);
}
}
}
@Override
public 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)
@Override
protected 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();
}
});
}
});
}
});
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==PICK_FROM_ALBUM && resultCode==RESULT_OK) {
profile.setImageURI(data.getData());
imageUri = data.getData();
}
}
} '''
답변을 작성해보세요.
답변 2