- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从手机向多个联系人发送消息。流程是我正在创建一个血库应用程序,当用户请求血液时,我会在 firebase 回收器 View 中向他显示所有具有匹配血型的用户列表。在回收器中,我正在向他显示带有 2 个调用图标的用户名和单击任何所需图标时的消息,该过程工作正常。我想要的是当用户在向他显示匹配血型人员列表后请求血液时,我应该务实地向匹配血型列表中显示的所有用户发送消息。我查看了多个问题并尝试了答案,但没有成功。
在此我尝试了堆栈溢出的另一种解决方案,但结果是一样的,它没有发送消息
private RecyclerView recyclerView;
private DatabaseReference reference;
String bloodGroup;
LinearLayout linearLayout;
ProgressDialog progressDialog;
FirebaseRecyclerOptions<Profiles> model;
FirebaseRecyclerAdapter<Profiles, DonarViewHolder> adapter;
ArrayList<String> contactNumber = new ArrayList<>();
HashSet<String> numbersSet = new HashSet<>();
int MY_PERMISSIONS_REQUEST_SEND_SMS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_donar_list);
getView();
showRecyclerView();
sendMsg();
contactNumber.addAll(numbersSet);
}
private void sendMsg() {
for (int i = 0; i < contactNumber.size(); i++)
{
String message = "Blood Required Urgently";
String tempMobileNumber = contactNumber.get(i).toString();
MultipleSMS(tempMobileNumber, message);
}
}
private void MultipleSMS(String phoneNumber , String message) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
// ---when the SMS has been sent---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
ContentValues values = new ContentValues();
for (int i = 0; i < contactNumber.size() - 1; i++) {
values.put("address", contactNumber.get(i).toString());
// txtPhoneNo.getText().toString());
values.put("body", "Blood Required Urgently");
}
getContentResolver().insert(
Uri.parse("content://sms/sent"), values);
Toast.makeText(DonarList.this, "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(DonarList.this, "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(DonarList.this, "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(DonarList.this, "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(DonarList.this, "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
// ---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(DonarList.this, "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(DonarList.this, "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
private void showRecyclerView() {
adapter = new FirebaseRecyclerAdapter<Profiles, DonarViewHolder>(model) {
@Override
protected void onBindViewHolder(@NonNull DonarViewHolder holder, int position, @NonNull Profiles profiles) {
String check = profiles.getBloodBank();
String number = profiles.getMobile_number();
numbersSet.add(profiles.getMobile_number());
System.out.println("all" + numbersSet);
ArrayList<String> bloodGroupMatched = new ArrayList<>();
bloodGroupMatched.addAll(profiles.getMatched_bloodGroups());
System.out.println("check" + bloodGroupMatched);
if (bloodGroupMatched.contains(bloodGroup)) {
holder.name.setText(profiles.getName());
holder.itemView.setVisibility(View.VISIBLE);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(10, 5, 5, 10);
holder.itemView.setLayoutParams(params);
} else {
holder.itemView.setVisibility(View.GONE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
}
holder.call.setOnClickListener(v -> {
boolean conditionCheck = true;
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.setData(Uri.parse("tel:" + number));
if (ActivityCompat.checkSelfPermission(DonarList.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DonarList.this,
new String[]{Manifest.permission.CALL_PHONE}, 1);
}
startActivity(callIntent);
});
holder.msg.setOnClickListener(v -> {
Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + number));
if (ActivityCompat.checkSelfPermission(DonarList.this,
Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DonarList.this,
new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
} else {
startActivity(smsIntent);
}
});
}
@NonNull
@Override
public DonarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_donar_view_holder, parent, false);
return new DonarViewHolder(view);
}
};
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter.startListening();
progressDialog.dismiss();
recyclerView.setAdapter(adapter);
}
private void getView() {
progressDialog = HelperClass.showProgressDialog(this, "Loading..");
if (getIntent() != null && getIntent().hasExtra("bloodGroup")) {
bloodGroup = getIntent().getStringExtra("bloodGroup");
Toast.makeText(this, bloodGroup, Toast.LENGTH_SHORT).show();
}
recyclerView = findViewById(R.id.donar_list_recycler);
linearLayout = findViewById(R.id.recylerLayout);
reference = FirebaseDatabase.getInstance().getReference().child(Constants.content).child(Constants.profiles);
model = new FirebaseRecyclerOptions.Builder<Profiles>()
.setQuery(reference, Profiles.class).build();
}
@Override
public void onStart() {
super.onStart();
if (adapter != null) {
adapter.startListening();
}
}
@Override
public void onStop() {
super.onStop();
if (adapter != null) {
adapter.stopListening();
}
}
@Override
protected void onResume() {
super.onResume();
if (adapter != null) {
adapter.startListening();
}
}
}
注意:我正在尝试向多个用户而不是单个用户发送消息
最佳答案
我找到了 2 个解决方案。
1-在从 firebase 获取数据时,我通过将消息代码放在我获取用户详细信息的位置来立即向用户发送消息(它将获得 1 个数字并向其发送消息,然后是另一个,然后是另一个,然后它会设置适配器,是的,在此期间我会显示一些进度条或其他东西)。
2-我可以在我的应用程序中做的另一件事是在列表下方显示向用户发送消息的按钮,并将所有联系电话存储到数组列表中,同时获取用户数据,当用户单击该按钮时向所有人发送消息使用我们在 arrayList 中获得的那些数字。
像这样:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_donar_list);
getView();
showRecyclerView();
contactNumber.addAll(numbersSet);
}
private void showRecyclerView() {
adapter = new FirebaseRecyclerAdapter<Profiles, DonarViewHolder>(model) {
@Override
protected void onBindViewHolder(@NonNull DonarViewHolder holder, int position, @NonNull Profiles profiles) {
String number = profiles.getMobile_number();
numbersSet.add(profiles.getMobile_number());
ArrayList<String> bloodGroupMatched = new ArrayList<>();
bloodGroupMatched.addAll(profiles.getMatched_bloodGroups());
if (bloodGroupMatched.contains(bloodGroup)) {
holder.name.setText(profiles.getName());
holder.itemView.setVisibility(View.VISIBLE);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(10, 5, 5, 10);
holder.itemView.setLayoutParams(params);
} else {
holder.itemView.setVisibility(View.GONE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
}
holder.call.setOnClickListener(v -> {
boolean conditionCheck = true;
Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.setData(Uri.parse("tel:" + number));
if (ActivityCompat.checkSelfPermission(DonarList.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DonarList.this,
new String[]{Manifest.permission.CALL_PHONE}, 1);
}
startActivity(callIntent);
});
holder.msg.setOnClickListener(v -> {
Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + number));
if (ActivityCompat.checkSelfPermission(DonarList.this,
Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DonarList.this,
new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
} else {
startActivity(smsIntent);
}
});
}
@NonNull
@Override
public DonarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_donar_view_holder, parent, false);
return new DonarViewHolder(view);
}
};
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter.startListening();
progressDialog.dismiss();
recyclerView.setAdapter(adapter);
}
public void sendSMS() {
contactNumber.addAll(numbersSet);
try {
SmsManager smsManager = SmsManager.getDefault();
for (int i = 0; i < contactNumber.size(); i++) {
smsManager.sendTextMessage(contactNumber.get(i), null, "Blood Required!!!+_", null, null);
}
Toast.makeText(getApplicationContext(), "Message Sent",
Toast.LENGTH_LONG).show();
} catch (Exception ex) {
Toast.makeText(getApplicationContext(), ex.getMessage().toString(),
Toast.LENGTH_LONG).show();
ex.printStackTrace();
}
}
private void getView() {
progressDialog = HelperClass.showProgressDialog(this, "Loading..");
if (getIntent() != null && getIntent().hasExtra("bloodGroup")) {
bloodGroup = getIntent().getStringExtra("bloodGroup");
Toast.makeText(this, bloodGroup, Toast.LENGTH_SHORT).show();
}
recyclerView = findViewById(R.id.donar_list_recycler);
button = findViewById(R.id.Mmsgs);
linearLayout = findViewById(R.id.recylerLayout);
reference = FirebaseDatabase.getInstance().getReference().child(Constants.content).child(Constants.profiles);
model = new FirebaseRecyclerOptions.Builder<Profiles>()
.setQuery(reference, Profiles.class).build();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS();
}
});
}
}
关于android - 从android中的firebase数据库向多个号码发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59485577/
我正在使用 voip 推送通知制作 ios 应用程序。 我想从 Node js 发送 voip 推送通知,但不是很好。 我阅读了本教程 CallKit iOS Swift Tutorial for V
我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发回 404,但是当我调用 send() 时没有错误,但消息不会出现在网络上浏览器,除非我关闭连接? 有什么建议吗? 接受来自浏览器的
#include int main() { char c = getchar(); //EOF (ctrl + d ) while( ( c = getchar() ) != '?'
我正在尝试使用MailMessage对象通过PowerShell发送电子邮件。该脚本使用Import-CSV来使用文件,然后在电子邮件正文中使用ConvertTo-HTML。由于我要发送的电子邮件客户
我需要创建一个脚本,每 30 秒对网络流量进行一次采样并存储发送/接收的字节。该数据随后用于绘制图形。我编写了一个在 Windows 2012 上完美运行的程序,但我意识到某些 cmdlet 在以前的
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
当我使用网络浏览器测试我的程序时,我可以很好地写入套接字/FD,所以我决定循环它并在连接中途切断连接,我发现了一个问题。 send() 能够在套接字不可用时关闭整个程序。我认为问题在于该程序陷入了第
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
所以我试图向自己发送数据并接收数据然后打印它,现在我已经测试了一段时间,我注意到它没有发送任何东西,事实上,也许它是,但我没有正确接收它,我需要这方面的帮助。 这就是我用来发送数据的
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用 java 本质上将对象作为一个巨大的字符串发送,并用标记来分隔变量。 我的逻辑:我选择这个是因为它几乎消除了语言依赖性(忽略java的修改
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
我有一个包含三个单选按钮选项的表单。我需要将表单数据提交到另一个文件,但由于某种原因,发送的数据包含所选单选按钮的值“on”,而不是 value 属性的值。 我尝试通过 post() 函数手动操作和发
基本上我想实现这样的目标: Process 1 Thread 1 Receive X from process 2 Thread 2 Receive Y from proces
我目前正在 Google App Engine 上开发一个系统,对它还很陌生,我正在使用 Java 平台进行开发。我在 servlet 之间发送 session 对象时遇到问题。我已经在 appeng
当我尝试将“this”(触发的元素)作为参数发送给函数时,函数收到“Object[Document build.php]”作为参数,而不是触发的元素。请让我知道我的错误: function set(a
我正在寻找让我的应用响应联系人 > 发送的魔法咒语。我希望能够接收联系人的 URI 以便检索联系人。谁有 list 过滤器/代码 fragment 吗? 最佳答案 我没有睾丸,但您可以尝试基于 ACT
关于我心爱的套接字的另一个问题。我先解释一下我的情况。之后我会告诉你是什么困扰着我。 我有一个客户端和一个服务器。这两个应用程序都是用 C++ 编写的,实现了 winsock2。连接通过 TCP 和
我看到了这篇文章 http://www.eskimo.com/~scs/cclass/int/sx5.html 但这部分让我感到困惑:如果我们已经使用 send_array 或 send_array_
我对这行代码有疑问。我必须将一个数据包带到一个端口并重新发送到接口(interface)(例如:eth0)。我的程序成功地从端口获取数据包,但是当我重新发送(使用 send())到接口(interfa
我正在尝试编写一个 X11 输入驱动程序,它可以使用我的 Android 手机上的触摸屏来移动和单击鼠标。我可以正常移动鼠标,但我无法让应用程序正确识别点击。我当前的代码位于 https://gist
我是一名优秀的程序员,十分优秀!