Отображение уведомлений на Android Устройствах, вошедших в систему с той же учетной записью с использованием функций Firebase - PullRequest
0 голосов
/ 01 мая 2020

Я довольно новичок в android студии и FireBase. Недавно я пытался создать приложение. Пользователи этого приложения должны иметь возможность войти в одну и ту же учетную запись на нескольких android устройствах. Я планирую отправлять уведомления пользователю всякий раз, когда появляется новый запрос. Для отображения уведомлений на всех этих устройствах я использую функции Firebase с Node js. Однако даже после ознакомления со справочной документацией, доступной в Firebase и некоторыми учебными пособиями, я не смог правильно закодировать файл index. js, чтобы запустить эту функцию. Я продолжаю получать ошибки, о которых я упоминал ниже.

Это код, который я использовал в своем индексе. js file,

'use strict'

const functions = require('firebase-functions'); 

const admin = require('firebase-admin'); 

admin.initializeApp(functions.config().firebase);

exports.sendNotification = functions.database.ref('/notifications/{user_id}/{notification_id}').onWrite((data, context) => { 
const user_id = context.params.user_id;
const notification = context.params.notification; 
console.log('We have a notification to send: ',context.params.user_id);

if(!event.data.val()){
   return console.log('A Notification has been deleted from the database', notification_id);
}



var query = admin.database().ref(`/Users/${user_id}/device_token`).orderByKey();

query.once("value")
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
            var key = childSnapshot.key;
         return true;


    });
  });
 }); 

Вот так выглядит моя база данных для хранения token_id,

database structure

Наконец, это код, который я использовал для добавления друзей (точнее, в моем приложении).

package com.example.eguru_std;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.renderscript.Sampler;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
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.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Objects;

public class ProfileActivity extends AppCompatActivity {

    private TextView mDisplayID;
    private TextView mProfileName, mProfileLang;
    private Button mProfileSendReqBtn;

    private DatabaseReference mUsersDatabase;

    private ProgressDialog mProgressDialog;

    private String mCurrent_state;

    private DatabaseReference mFriendReqDatatbase;

    private DatabaseReference mFriendDatabase;

    private FirebaseUser mCurrent_user;

    private DatabaseReference mNotificationDatabase;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

        final String user_id = getIntent().getStringExtra("user_id");

        assert user_id != null;
        mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id);
        mFriendReqDatatbase = FirebaseDatabase.getInstance().getReference().child("Friend_req");
        mFriendDatabase = FirebaseDatabase.getInstance().getReference().child("Friends");
        mNotificationDatabase = FirebaseDatabase.getInstance().getReference().child("notifications");
        mCurrent_user = FirebaseAuth.getInstance().getCurrentUser();

        mProfileName = (TextView) findViewById(R.id.profile_displayName);
        mProfileLang = (TextView) findViewById(R.id.profile_lang);
        mProfileSendReqBtn = (Button) findViewById(R.id.profile_send_req_btn);

        mCurrent_state = "not_friends";

        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setTitle("Loading User Data");
        mProgressDialog.setMessage("Please Wait");
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgressDialog.show();

        mUsersDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String display_name = Objects.requireNonNull(dataSnapshot.child("Name").getValue()).toString();
                String languages = Objects.requireNonNull(dataSnapshot.child("Languages").getValue()).toString();

                mProfileName.setText(display_name);
                mProfileLang.setText(languages);

                //============FRIENDS LIST/ REQUEST FEATURE===============//

                mFriendReqDatatbase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        if(dataSnapshot.hasChild(user_id)){
                            String req_type = dataSnapshot.child(user_id).child("request_type").getValue().toString();
                            if(req_type.equals("recieved")){
                                mCurrent_state = "req_recieved";
                                mProfileSendReqBtn.setText("Accept Request");
                            }
                            else if(req_type.equals("sent")){
                                mCurrent_state = "req_sent";
                                mProfileSendReqBtn.setText("Decline Request ");
                            }
                            mProgressDialog.dismiss();

                        } else{
                            mFriendDatabase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if(dataSnapshot.hasChild(user_id)){
                                        mCurrent_state = "friends";
                                        mProfileSendReqBtn.setText("Remove Subject");
                                    }
                                    mProgressDialog.dismiss();
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                    mProgressDialog.dismiss();
                                }
                            });
                        }




                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });



            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


        mProfileSendReqBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mProfileSendReqBtn.setEnabled(false);

                if(mCurrent_state.equals("not_friends")){
                    mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).child("request_type")
                            .setValue("sent").addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){
                                mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).child("request_type")
                                        .setValue("recieved").addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @SuppressLint("SetTextI18n")
                                    @Override
                                    public void onSuccess(Void aVoid) {

                                        HashMap<String, String> notificationData = new HashMap<>();
                                        notificationData.put("from", mCurrent_user.getUid());
                                        notificationData.put("type", "request");

                                        mNotificationDatabase.child(user_id).push().setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
                                            @Override
                                            public void onSuccess(Void aVoid) {
                                                mCurrent_state = "req_sent";
                                                mProfileSendReqBtn.setText("Remove Subject");
                                            }
                                        });


                                        Toast.makeText(ProfileActivity.this, "Request Sent", Toast.LENGTH_SHORT).show();

                                    }
                                });
                            }
                            else{
                                Toast.makeText(ProfileActivity.this, "Failed Adding Subject", Toast.LENGTH_SHORT).show();
                            }
                            mProfileSendReqBtn.setEnabled(true);
                        }
                    });
                }
                //================Remove Subject==================//
                if(mCurrent_state.equals("req_sent")){
                    mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {

                            mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    mProfileSendReqBtn.setEnabled(true);
                                    mCurrent_state = "not_friends";
                                    mProfileSendReqBtn.setText("Add Subject");
                                }

                            });

                        }

                    });
                }

                ///==============Request recieved state===============//

                if(mCurrent_state.equals("req_recieved")){

                    final String currentDate = DateFormat.getDateTimeInstance().format(new Date());

                    mFriendDatabase.child(mCurrent_user.getUid()).child(user_id).setValue(currentDate).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            mFriendDatabase.child(user_id).child(mCurrent_user.getUid()).setValue(currentDate)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                                @Override
                                                public void onSuccess(Void aVoid) {

                                                    mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                                        @Override
                                                        public void onSuccess(Void aVoid) {
                                                            mProfileSendReqBtn.setEnabled(true);
                                                            mCurrent_state = "friends";
                                                            mProfileSendReqBtn.setText("Remove Subject");
                                                        }

                                                    });

                                                }

                                            });
                                        }
                                    });
                        }
                    });

                }

            }
        });

    }
}

Ошибки, которые я получаю при попытке развернуть, следующие: ,

i развертывание функций Выполнение команды: npm --префикс "$ RESOURCE_DIR" run lint

functions @ lint C: \ Users \ user \ Desktop \ eGuru \ messagesFunction \ functions eslint.

C: \ Users \ пользователь \ Desktop \ eGuru \ventFunction \ functions \ index. js
9: 121 предупреждение Ожидается, что будет возвращено значение в конце стрелки функция непротиворечивая-22: 1 ошибка ожидается c atch () или возвращать обещание / ловить или возвращать 23: 9
предупреждение Неожиданное выражение функции
Предпочитать-стрелка-обратный вызов 23: 9 Ошибка Каждый оператор then () должен возвращать значение или генерировать обещание / всегда возвращаемый результат 24 : 22 предупреждение Неожиданное выражение функции
предпочитать-обратный вызов стрелки

✖ 5 проблем (2 ошибки, 3 предупреждения) 0 ошибок и 2 предупреждения, которые потенциально можно исправить с помощью опции --fix.

npm ОШИБКА! код ELIFECYCLE npm ОШИБКА! errno 1 npm ERR! functions @ lint: eslint . npm ERR! Статус выхода 1 npm ERR! npm ОШИБКА! Сбой в скрипте functions @ lint. npm ОШИБКА! Это, вероятно, не проблема с npm. Скорее всего, выше вывод журнала.

npm ОШИБКА! Полный журнал этого прогона можно найти в: npm ERR!
C: \ Users \ user \ AppData \ Roaming \ npm -cache_logs \ 2020-05-01T13_25_19_389Z-debug.log events. js: 287 бросок эр; // Необработанное событие 'error' ^

Ошибка: spawn npm --prefix "% RESOURCE_DIR%" run lint ENOENT at notFoundError (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 6: 26) в verifyENOENT (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase -tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 40: 16) в ChildProcess.cp.emit (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 27: 25) в Process.ChildProcess._handle.onexit (внутренний / дочерний_процесс. js: 275: 12) Произошло событие «ошибка» в экземпляре ChildProcess по адресу: в ChildProcess.cp.emit (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 30: 37) в Process.ChildProcess._handle.onexit (internal / child_process. js: 275: 12) {code: 'ENOENT', errno: 'ENOENT', syscall: 's pawn npm --prefix "% RESOURCE_DIR%" run lint ',
path:' npm --prefix "% RESOURCE_DIR%" run lint ', spawnargs: []}

Ошибка: функции предустановленной ошибки: команда завершена с ненулевым кодом выхода1

Я пробовал разные варианты с индексом. js код и не знаю, как мне решить эту проблему. Пожалуйста, укажите я в правильном направлении. Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...