передавать данные широковещательному приемнику, у которого уже есть фильтр намерений, исходящий от активности

когда телефон подключен к блютусу в машине. Я хочу, чтобы мое приложение включалось автоматически. для этого я должен сохранить имя сопряженного автомобильного Bluetooth-устройства в строку. затем, когда телефоны bluetooth подключены к чему-либо. Я должен проверить, машина ли это. Если это так, я хочу запустить службу.

У меня возникли трудности с передачей строки, содержащей имя автомобильного устройства Bluetooth, в приемник, так как мой приемник уже получает фильтр намерений для прослушивания ACTION_ACL_CONNECTED. можно ли отправить намерение и фильтр намерения одному и тому же получателю.

Как я могу отправить строку btdeviceName из действия в получатель в этом случае.

Основное действие

 private void addDrawerItems() {

    final BroadcastReceiver bluetoothBroadcast = new BluetoothReceiver();
    final IntentFilter blueToothFilter = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);


    final Intent btbroadcastIntent = new Intent(this, BluetoothReceiver.class);
    btbroadcastIntent.putExtra("btDeviceName", mPairedBluetoothDevice);


    String[] osArray = {"Bluetooth Auto Start", "Reply to Calls", "Reply to sms", "Customise Message"};

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, osArray);


    if (mIsPremiumUser) {
        mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
    } else {
        mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_NONE);
    }

    mDrawerList.setAdapter(mAdapter);


    mDrawerList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {


            if (position == 0) {
                Toast.makeText(getApplicationContext(), "blue", Toast.LENGTH_LONG).show();
                showBluetoothDialog();
            }
            return true;
        }
    });


    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            CheckedTextView ctv = (CheckedTextView) view;

            if (!mIsPremiumUser) {
                Toast.makeText(getApplication(), "Upgrade", Toast.LENGTH_LONG).show();
                return;
            }


            switch (position) {

                case 0:

                    if (ctv.isChecked()) {

                        if (!isblueToothRegistered) {
                            registerReceiver(bluetoothBroadcast, blueToothFilter);
                            sendBroadcast(btbroadcastIntent);
                            isblueToothRegistered = true;
                        }

                    } else {
                        if (isblueToothRegistered) {
                            unregisterReceiver(bluetoothBroadcast);
                            isblueToothRegistered = false;
                        }
                    }

                    break;

BluetoothReceiver

public class BluetoothReceiver extends BroadcastReceiver {

private MainActivity ma;
private String pairedDevice;


public void onReceive(Context context, Intent intent) {


    Toast.makeText(context, "Receieved", Toast.LENGTH_LONG).show();
    String action = intent.getAction();

    pairedDevice = intent.getStringExtra("btDeviceName");
    Toast.makeText(context, pairedDevice + "2", Toast.LENGTH_LONG).show();

    final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);


    if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
        Toast.makeText(context, "Bluetooth Connected", Toast.LENGTH_LONG).show();


        if (device.getName().equals(pairedDevice)) {
            Toast.makeText(context, device.getName() + " 1", Toast.LENGTH_LONG).show();
        }


    } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
        Toast.makeText(context, "Bluetooth Disconnected", Toast.LENGTH_LONG).show();
    }


}

}


person Andrew Irwin    schedule 26.04.2016    source источник


Ответы (1)


IntentFilter может иметь несколько действий. Итак, начните с создания собственного имени пользовательского действия для прослушивания и добавьте его в файл blueToothFilter.

blueToothFilter.addAction("my.custom.action");

Как только вы зарегистрируете приемник bluetoothBroadcast с этим IntentFilter, он теперь будет получать вызовы для обоих действий. Добавьте еще одно условие в onReceive для обработки вашего нового пользовательского действия.

Наконец, в своем Activity отправьте широковещательную рассылку с вашим пользовательским действием и именем устройства, когда оно будет готово.

Intent intent = new Intent()
        .setAction("my.custom.action")
        .putExtra("btDeviceName", mPairedBluetoothDevice);

sendBroadcast(intent);

ОБНОВИТЬ

Теперь я понимаю, что вам нужны и BluetoothDevice device, и String pairedDevice в одном вызове onReceive(). Это невозможно, поскольку эти переменные берутся из отдельных действий, и каждое действие вызывает onReceive() один раз.

Чтобы исправить это, вы можете изменить BluetoothReceiver на внутренний класс вашего Activity, чтобы вы могли хранить там ссылку на нужные вам данные.

person George Mulligan    schedule 26.04.2016
comment
Большое спасибо. Я все еще немного смущен тем, как это выглядит в широковещательном приемнике? - person Andrew Irwin; 26.04.2016
comment
как отличить два действия в приемнике? - person Andrew Irwin; 26.04.2016
comment
Вы проверяете, что возвращается из intent.getAction(). Сейчас у вас есть два дела: одно для BluetoothDevice.ACTION_ACL_DISCONNECTED, а другое для BluetoothDevice.ACTION_ACL_CONNECTED. Вам нужно добавить третий, который проверяет имя вашего пользовательского действия, как бы вы его ни назвали (в моем примере это my.custom.action). Если это действие, то вы знаете, что в намерении будет btDeviceName больше. - person George Mulligan; 26.04.2016
comment
Я думаю, что вижу часть путаницы сейчас. В настоящее время вы ожидаете, что сможете получить устройство из действия ACTION_ACL_CONNECTED и имя устройства из пользовательского Action в том же событии onReceive. К сожалению, этого не произойдет, поскольку это отдельные события. Вы получите два отдельных вызова onReceive, один из которых содержит String pairedDevice, а другой — BluetoothDevice device. Один из способов сделать это — сделать BluetoothReceiver внутренним классом для Activity, чтобы вы могли хранить там ссылки на нужные вам данные. - person George Mulligan; 26.04.2016
comment
да, это сделало работу! наличие получателя в качестве внутреннего класса в основном действии работало. Вы хотите обновить свой ответ, чтобы сказать это? немного глупо, что простейшая вещь — просто передать строковую переменную из одного класса в другой — оказалась такой сложной! - person Andrew Irwin; 26.04.2016
comment
Спасибо. Я обновил ответ соответствующими битами из комментария. - person George Mulligan; 26.04.2016
comment
Спасибо себе приятного вечера ???????? - person Andrew Irwin; 26.04.2016