Создать прослушиватель, передать значение из BroadcastReceiver - PullRequest
0 голосов
/ 21 сентября 2019

Я сомневаюсь, как мне выполнить одно действие.

Когда я получаю один доходный звонок, я хочу передать номер своему классу, который управляет соединением Bluetooth с Arduino.

После отправки номера я хотел бы отправить его по Bluetooth-соединению

Я пытался использовать намерение, но, возможно, я использую устаревшую версию.

Android Api 7.1

BrodcasterКласс приемника

package com.jidea.glass;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class TelephonyReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
        try {
            if (intent != null && intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
                //Toast.makeText(context, "Outgoign call", 1000).show();
                String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            } else {
                //get the phone state
                String newPhoneState = intent.hasExtra(TelephonyManager.EXTRA_STATE) ? intent.getStringExtra(TelephonyManager.EXTRA_STATE) : null;
                Bundle bundle = intent.getExtras();

                if (newPhoneState != null && newPhoneState.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    //read the incoming call number
                    String phoneNumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                    Log.i("PHONE RECEIVER", "Telephone is now ringing " + phoneNumber);
                    //Toast.makeText(arg0, "Tele disponivel " + phoneNumber, Toast.LENGTH_LONG).show();
                    if(phoneNumber!=null | phoneNumber.equals("")){
                               PASS HERE TO BLUETOOTH           
                    }
                }

Класс Bluetooth

package com.jidea.glass;


import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
//import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.util.UUID;

public class CustomProcess extends AppCompatActivity
{
    String address = null;
    private ProgressDialog progress;
    BluetoothAdapter myBluetooth = null;
    BluetoothSocket btSocket = null;
    private boolean isBtConnected = false;
    //SPP UUID. Look for it
    static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    //observable


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent newint = getIntent();
        address = newint.getStringExtra(MainActivity.EXTRA_ADDRESS); //receive the address of the bluetooth device
        setContentView(R.layout.activity_custom_process);
        //msg(address);
        new ConnectBT().execute(); //Call the class to connect

    }
    public void isConnected() {//View view
        if (btSocket!=null)
        {
            try
            {
                btSocket.getOutputStream().write("Conectado".toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    public void haveCall(String Phone) {//View view
        Object aLig="Ligação \n"+Phone;
        if (btSocket!=null)
        {
            try
            {
                btSocket.getOutputStream().write(aLig.toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    private void msg(String s)
    {
        Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
    }

    private class ConnectBT extends AsyncTask<Void, Void, Void>  // UI thread
    {
        private boolean ConnectSuccess = true; //if it's here, it's almost connected

        @Override
        protected void onPreExecute()
        {
            progress = ProgressDialog.show(CustomProcess.this, "Connecting...", "Please wait!!!");  //show a progress dialog
        }

        @Override
        protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
        {
            try
            {
                if (btSocket == null || !isBtConnected)
                {
                    myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
                    BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
                    btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    btSocket.connect();//start connection
                }
            }
            catch (IOException e)
            {
                ConnectSuccess = false;//if the try failed, you can check the exception here
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
        {
            super.onPostExecute(result);

            if (!ConnectSuccess)
            {
                msg("Connection Failed. Is it a SPP Bluetooth? Try again.");
                finish();
            }
            else
            {
                msg("Conectado");
                isBtConnected = true;
                isConnected();
            }
            progress.dismiss();
        }
    }


}

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Я решил это сделать внутренний слушатель Java с интерфейсом кодов.

package com.jidea.glass;

public interface TelephonyListener
{

    /**
     * To call this method when new message received and send back
     * @param message Message
     */
    void callReceived(String message);
}

public class CustomProcess extends AppCompatActivity implements MessageListener, TelephonyListener

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MessageReceiver.bindListener(this);
        TelephonyReceiver.bindListener(this);
        Intent newint = getIntent();
        address = newint.getStringExtra(MainActivity.EXTRA_ADDRESS); //receive the address of the bluetooth device
        setContentView(R.layout.activity_custom_process);
        //msg(address);
        new ConnectBT().execute(); //Call the class to connect

  @Override
    public void messageReceived(String message)
    {
        Toast.makeText(this, "Nova Mensagem: " + message, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void callReceived(String message) {
        Toast.makeText(this , "Tele disponivel " + message, Toast.LENGTH_LONG).show();
        haveCall(message);
    }
Продолжается в моем классе. Приемник расширяет BroadcastReceiver I Donw

public class TelephonyReceiver extends BroadcastReceiver
{
    private static TelephonyListener  mListener;
    
    @Override
    public void onReceive(Context arg0, Intent intent) {
    // TODO Auto-generated method stub
    }
     public static void bindListener(TelephonyListener listener){
        mListener = listener;
    }
0 голосов
/ 21 сентября 2019

Сначала вы должны создать намерение в своем BroadcastReceiver, а затем использовать LocalBroadcastManager, чтобы иметь возможность отправлять это намерение туда, куда хотите слушать.

val intent = Intent(ACTION)
intent.putExtra("DATA KEY", DATA)
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)

не забудьте зарегистрировать приемник вещания вгде вы хотите слушать

LocalBroadcastManager.getInstance(context).registerReceiver(your broadcast receiver instance, IntentFilter(ACTION))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...