java - Textlocal API 仅向一个用户发送短信,不向其他用户发送短信

标签 java android firebase firebase-realtime-database

我正在开发存储学生出勤率的出勤应用程序,我想偶尔将他们的出勤率发送给他们的 parent 。所以问题是当我从 firebase 数据库中检索所有学生的姓名、百分比、电话号码并使用 Textlocal API 向他们发送短信时,它只向一个用户发送短信,其余用户不发送。如果有人帮助我,我很高兴。提前致谢。

DatabaseReference databaseReference=FirebaseDatabase.getInstance().getReference("Students");
                    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            for (final DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){

                                        Student student=dataSnapshot1.getValue(Student.class);

                                        final String name=student.getName();
                                        final String phone=student.getPhone();
                                        final String reg=student.getReg();

                                        DatabaseReference databaseReference1=FirebaseDatabase.getInstance().getReference("Count");
                                        databaseReference1.child(reg).addListenerForSingleValueEvent(new ValueEventListener() {
                                            @Override
                                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                                if (dataSnapshot.exists()){
                                                    int presentPeriods=dataSnapshot.getValue(int.class);
                                                    int totalPeriods=totalWorkingDays*7;
                                                    float percent=(float)presentPeriods/(float)totalPeriods*100;
                                                    int nPrecent=(int)percent;
                                                    sendSMS(name,phone,reg,nPrecent);
                                                }
                                                else {
                                                    int percent=0;
                                                    sendSMS(name,phone,reg,percent);
                                                }
                                            }

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

                                            }
                                        });



                            }
                        }

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

                        }
                    });

private void sendSMS(String name, String phone, String reg, int percent) {
    if (networkAvailable()){
        Toast.makeText(this, "Sending alerts...", Toast.LENGTH_SHORT).show();
        System.out.println("To: "+phone.replace("+91","")+" / "+"Your ward, "+name+" with Register Number "+reg.replace("R","")+" is having Attendance percentage of "+percent+" as on "+new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date()));
        String out="Your ward, "+name+" with Register Number "+reg.replace("R","")+" is having Attendance percentage of "+percent+" as on "+new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());
        String toNumber=phone.replace("+91","");


        try {
            // Construct data
            String apiKey = "apikey=" + "XXXXXXXXXXX";
            String message = "&message=" + out;
            String sender = "&sender=" + "TXTLCL";
            String numbers = "&numbers=" + toNumber;

            // Send data
            HttpURLConnection conn = (HttpURLConnection) new URL("https://api.textlocal.in/send/?").openConnection();
            String data = apiKey + numbers + message + sender;
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Length", Integer.toString(data.length()));
            conn.getOutputStream().write(data.getBytes("UTF-8"));
            final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            final StringBuffer stringBuffer = new StringBuffer();
            String line;
            while ((line = rd.readLine()) != null) {
                stringBuffer.append(line);
            }
            rd.close();
            Toast.makeText(this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            System.out.println("Error SMS "+e);
            Toast.makeText(this,"Error: "+e.toString() , Toast.LENGTH_SHORT).show();
        }

    }
    else {
        Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
    }
}

最佳答案

databaseReference1.child(reg).addListenerForSingleValueEvent() 被触发时,phone 已经设置为最后一个 student 对象值。因此,无论何时触发 databaseReference1 监听器,都会将短信发送到列表中的最后一个电话值。

相应地修改您的逻辑。

关于java - Textlocal API 仅向一个用户发送短信,不向其他用户发送短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54547529/

相关文章:

Java - 找到异常的第一个原因

java - 如何让UDP服务器响应UDP客户端数据包?

java - 如何制作一个 6 行 2 列的 Java GridBagLayout

java - 实时报告 Tomcat Webserver

Android onSearchRequested() 回调到调用 Activity

android - 无法在Flutter中使用Hive插件

firebase - 部署到 firebase 云功能时出错 - ?缺少配置详细信息

Javascript - 如何一次从 Firebase 访问多组项目?

Android通知打开后重新出现

android - 在android中的3个选项卡中的每个选项卡的 ListView 中添加不同的项目