具有主题

时间:2017-11-17 18:32:00

标签: android

很抱歉,如果这篇文章重复,但我在这里找不到答案,所以我决定发一个新问题。

无论如何,我可以通过一个按钮轻松地将设备的通知发送到特定主题的其他设备吗?

我知道我已成功通过其网站https://console.firebase.google.com/u/0/project/project/notification通过firebase通知推送通知,但我想在自己的设备中执行此操作。

完整的方法对我很有帮助。

mSendNotificationBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        sendNotificationToTopic("title","description","latestNews");
    }
});

以上是我的按钮示例。

更新

在尝试了一些代码后,我决定将通知管理器与侦听firebase数据库的线程结合起来,如下所示

    DatabaseReference mDatabaseNotification = FirebaseDatabase.getInstance().getReference().child("Notification");
    String subscribedTopic = "news";

    Thread thread = new Thread(){
        @Override
        public void run() {
            mDatabaseNotification.child(subscribedTopic ).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if(dataSnapshot != null) {
                        if(dataSnapshot.child("title").getValue(String.class) != null && dataSnapshot.child("desc").getValue(String.class) != null) {

                            NotificationCompat.Builder mBuilder =
                                new NotificationCompat.Builder(MainActivity.this)
                                    .setSmallIcon(R.mipmap.ic_launcher)
                                    .setContentTitle(dataSnapshot.child("abc").child("title").getValue(String.class))
                                    .setContentText(dataSnapshot.child("abc").child("desc").getValue(String.class));
                            int mNotificationId = 001;
                            NotificationManager mNotifyMgr =
                                    (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                            mNotifyMgr.notify(mNotificationId, mBuilder.build());

                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {}
            });
        }
    };
    thread.start();

它工作正常,我可以通过编辑subscribedTopic来订阅用户,并且只在背景上监听该数据库。
所以,另一个问题是,这会导致以后出现问题吗?

更新2

我发现了一个错误,即使数据发生了变化,ValueEventListener也会多次触发...

更新3
检查下面的答案

2 个答案:

答案 0 :(得分:1)

首先,用户必须生成 String token = FirebaseInstanceId.getInstance().getToken();然后将其存储在firebase数据库中,并将userId作为键,或者您可以通过FirebaseMessaging.getInstance().subscribeToTopic("topic");

将用户订阅到任何主题

要发送通知,您必须点击此api https://fcm.googleapis.com/fcm/send标题为“授权”您的FCM密钥,Content-Type为“application / json”,请求正文应为

{ 
 "to": "/topics or FCM id",
 "priority": "high",
 "notification": {
    "title": "Your Title",
    "text": "Your Text"
  }
 "data": {
     "customId": "02",
     "badge": 1,
     "sound": "",
    "alert": "Alert"
  }
}

或者您可以使用不推荐使用的okHttp方法,因为您的FCM密钥会被暴露并且可能被滥用。

public class FcmNotifier {

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

public static void sendNotification(final String body, final String title) {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                OkHttpClient client = new OkHttpClient();
                JSONObject json = new JSONObject();
                JSONObject dataJson = new JSONObject();
                dataJson.put("text", body);
                dataJson.put("title", title);
                dataJson.put("priority", "high");
                json.put("notification", dataJson);
                json.put("to", "/topics/topic");
                RequestBody body = RequestBody.create(JSON, json.toString());
                Request request = new Request.Builder()
                        .header("Authorization", "key=your FCM key")
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response = client.newCall(request).execute();
                String finalResponse = response.body().string();
                Log.i("kunwar", finalResponse);
            } catch (Exception e) {

                Log.i("kunwar",e.getMessage());
            }
            return null;
        }
    }.execute();

}
}

答案 1 :(得分:0)

这是我用android和firebase数据库帮助实现通知的最简单方法。

将此添加到AndroidManifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service android:name="YourNotificationService"></service>
<application>
    <receiver android:name=".BootListener">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>
</application>

然后创建一个扩展BroadcastReceiver以用于启动侦听器的java类

public class BootListener extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        context.startService(new Intent(context, YourNotificationService.class));
    }
}

然后创建一个扩展服务的java类,以在后台运行通知

public class YourNotificationService extends Service {

    private DatabaseReference mDatabase;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent pIntent, int flags, int startId) {
        mDatabase = /*your firebase*/
        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                /* your code */
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });

        return super.onStartCommand(pIntent, flags, startId);
    }
}

您可以将其与SharedPreference或用户信息结合使用,以收听特定的firebase数据库。