当我将新闻添加到我的 Firebase 时,有啥方法可以自动发送推送通知

Posted

技术标签:

【中文标题】当我将新闻添加到我的 Firebase 时,有啥方法可以自动发送推送通知【英文标题】:is there any way i can automatically send push notifications when i add news to my firebase当我将新闻添加到我的 Firebase 时,有什么方法可以自动发送推送通知 【发布时间】:2017-01-09 13:56:42 【问题描述】:

这是用于向火力基地添加新闻的java文件

public class newsadding extends AppCompatActivity 
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("allNews");

    EditText date, name;
    Button btsave, btdelete, btshow;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_newsadding);

        date =(EditText) findViewById(R.id.id);
        name =(EditText) findViewById(R.id.editName);

        btsave = (Button) findViewById(R.id.btSave);
        btdelete = (Button) findViewById(R.id.btDelete);
        btshow = (Button) findViewById(R.id.btShow);

        // save the record
        btsave.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                String  n = date.getText().toString();
                String nom = name.getText().toString();
                try 
                    myRef.child("allNews").push().setValue(n+" : "+nom);
                    Toast.makeText(newsadding.this, "Record saved", Toast.LENGTH_SHORT).show();
                
                catch (Exception e)
                
                    Toast.makeText(newsadding.this, "Record not saved" + e.toString(), Toast.LENGTH_SHORT).show();
                
            
        );

        // delete a record

        btdelete.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                try 
                    String n = date.getText().toString();
                    String q = database.getReference().toString();
                    Toast.makeText(newsadding.this, "record deleted", Toast.LENGTH_SHORT).show();
                
                catch (Exception ex) 
                    Toast.makeText(newsadding.this, ex.getMessage(), Toast.LENGTH_SHORT).show();
                
            
        );

        // show all records

        btshow.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                Intent i1 = new Intent(newsadding.this, usernews.class);
                startActivity(i1);
            
        );
    

这是用于在列表视图中显示信息的文件

public class usernews extends AppCompatActivity 
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("allNews").child("allNews");
    TextView fullnews;

    ProgressBar loading;
    private ListView lsStudents;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_usernews);
        loading = (ProgressBar) findViewById(R.id.loading);
        lsStudents=(ListView) findViewById(R.id.list);
        fullnews=(TextView) findViewById(R.id.fullnews);
        fullnews.setVisibility(View.INVISIBLE);

        Toast.makeText(usernews.this,
                 "يرجى التأكد من أنك متصل بالإنترنت إذالم تكن متصل بعد...", Toast.LENGTH_LONG).show();

        myRef.addValueEventListener(new ValueEventListener() 

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 
                // This method is called once with the initial value and again
                // whenever data at this location is updated.

                final List<String> areas = new ArrayList<String>();
                for (DataSnapshot areaSnapshot: dataSnapshot.getChildren()) 
                    // Get value from areaSnapShot not from dataSnapshot
                    String value1 = String.valueOf(areaSnapshot.getValue());
                    areas.add(value1);

                    if (lsStudents.equals(null))
                        loading.setVisibility(View.VISIBLE);
                    

                    if (!lsStudents.equals(null))
                        loading.setVisibility(View.GONE);
                    
                

                String value2 = String.valueOf(dataSnapshot.getValue());    
                ArrayList<String> areas2 = new ArrayList<String>(areas);
                Collections.reverse(areas2);

                ArrayAdapter<String> areasAdapter = new ArrayAdapter<String>(usernews.this,android.R.layout.simple_expandable_list_item_1, areas);
                lsStudents.setAdapter(areasAdapter);
                lsStudents.setOnItemClickListener(new AdapterView.OnItemClickListener() 
                    public void onItemClick(AdapterView<?> adapter, View view, int position, long arg)  
                        fullnews.setVisibility(View.VISIBLE);
                        String newss = (lsStudents.getItemAtPosition(position).toString());
                        fullnews.setText(newss);
                    
                );
            

            @Override
            public void onCancelled(DatabaseError error) 
                // Failed to read value
                Toast.makeText(usernews.this,
                       error + "!!!!!خطاء في الاتصال !!!!!!", Toast.LENGTH_LONG).show();
            
        );
    

现在我知道您可以通过 fire base 页面上的通知栏从 fire base 发送信息,但我不想手动添加信息,因为我的应用程序中的这些页面用于新闻,我不能总是手动进行,因为我不是唯一添加这些新闻的人,所以我需要应用程序显示一个简单的栏,上面写着新新闻,我的应用程序名称和徽标在背景上带有消息声音。有人可以帮忙吗?

【问题讨论】:

当他/她发布新闻时,您可以直接从用户设备发送通知。 是的,我想过这样我使用添加新闻按钮的 OnButtonClick 消息发送但问题我不知道该怎么做。 ***.com/questions/38089148/… 【参考方案1】:

每次添加新闻时,您都可以在数据库中创建一个名为“通知”的子项,然后您可以在其中添加要为您发布的特定新闻项生成的通知的标题和消息。

确保所有使用您的应用的用户都订阅了某个主题。

最后,运行一个服务器端脚本(我为此使用 Node.js)来监听“通知”子节点,每次添加一个子节点时,它都会拍摄数据快照,检索标题和消息,并向您的用户订阅的主题发送主题通知。

只要您的应用中有服务处于活动状态并且它在后台运行,它就会自动收到推送通知。

有关主题通知和用于服务器通信的 REST API 的更多信息,请转至here。

【讨论】:

【参考方案2】:
    // Method to send Notifications from server to client end.
    public final static String AUTH_KEY_FCM = "API_KEY_HERE";
    public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";

    public static void pushFCMNotification( ) throws Exception 

        String authKey = AUTH_KEY_FCM; // You FCM AUTH key
        String FMCurl = API_URL_FCM;

        URL url = new URL(FMCurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setUseCaches(false);
        conn.setDoInput(true);
        conn.setDoOutput(true);

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "key=" + authKey);
        conn.setRequestProperty("Content-Type", "application/json");

        JSONObject data = new JSONObject();
        data.put("to","/topics/foo-bar");
        JSONObject info = new JSONObject();
        info.put("title", "FCM Notificatoin Title"); // Notification title
        info.put("body", "Hello First Test notification"); // Notification body
        data.put("data", info);

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data.toString());
        wr.flush();
        wr.close();

        int responseCode = conn.getResponseCode();
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) 
            response.append(inputLine);
        
        in.close();

    

btsave.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 

pushFCMNotification();

            
        );

【讨论】:

感谢您的帮助,但您能否再指导我一点,因为我使用 firebase 作为我的服务器。如何将此代码添加到火力基地?以及如何将我所有的设备 ID 注册到网络服务器?就我而言,该应用在应用商店中,并且有很多使用不同设备的用户。 public static void sendNotificationToUser(String user, final String message) Firebase ref = new Firebase(FIREBASE_URL);最终 Firebase 通知 = ref.child("notificationRequests");地图通知 = new HashMap(); notification.put("用户名", user); notification.put("消息", message);通知.push().setValue(通知); 我已经编辑了答案,它将完成你的工作,不要忘记投票。快乐编码。 我应该在哪里使用这种方法以及为什么总是在 firebase 和 push word 上出错【参考方案3】:

首先,您必须在客户端应用程序中注册并订阅主题。订阅后,他们将收到通知。要发送通知,请参阅this firebase 教程

【讨论】:

【参考方案4】:

将您的列表计数保存在共享首选项中。然后检查您的列表计数是否超过上次保存的列表计数。如果它更大,则构建本地通知并将列表中最后添加的项目显示为通知。 每次更改 Firebase 上的数据时,无需从 Firebase 推送通知。

【讨论】:

以上是关于当我将新闻添加到我的 Firebase 时,有啥方法可以自动发送推送通知的主要内容,如果未能解决你的问题,请参考以下文章

当我将 AVCaptureVideoPreviewLayer 添加到我的 UIView 时,UIButton 消失

当我将它添加到我的 html 文档时,向上/向下投票系统不起作用

使用 Keras,当我将 Tensorboard 回调添加到我的神经网络时,准确性会降低。我该如何解决?

为啥当我将查询字符串添加到我的 url 时,它会被 xampp 拒绝(“在此服务器上找不到请求的 URL”)

无法在 CocoaPod 中导入 Firebase

Multidex、Proguard 和 Firebase