首页 > 解决方案 > 从android中的firebase数据库向多个号码发送消息

问题描述

我想从移动设备向多个联系人发送消息。流程是我正在创建一个血库应用程序,在该应用程序中,当用户请求血液时,我会在 firebase 回收器视图中向他显示​​所有具有匹配血型的用户列表。在回收器中,我正在向他展示单击任何所需过程的任何图标时,带有 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();
        }
    }
}

注意:我正在尝试将消息发送给多个用户而不是单个用户

标签: androidfirebase-realtime-databaseandroid-messaging

解决方案


我为此找到了 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();
            }
        });
    }

}

推荐阅读