我正在开发存储学生出勤率的出勤应用程序,我想偶尔将他们的出勤率发送给他们的 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/