Textlocal API仅将SMS发送给一个用户,而不发送给其他用户

时间:2019-02-06 06:05:12

标签: java android firebase firebase-realtime-database

我正在做一个考勤应用程序,用于存储学生的出勤率,我想偶尔将其出勤率发送给父母。所以问题是当我从Firebase数据库中检索所有学生的姓名,百分比,电话号码并使用Textlocal API向他们发送SMS时,它仅向一个用户发送SMS,而其余用户则不发送。如果有人帮助我,我感到很高兴。预先感谢。

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();
    }
}

1 个答案:

答案 0 :(得分:2)

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

相应地修改逻辑。