在尝试以编程方式连接Android中的BT时,蓝牙配对拒绝

时间:2016-06-13 19:18:34

标签: android bluetooth android-bluetooth headphones

我正在尝试以编程方式将蓝牙设备(BT耳机)与我的Android应用程序连接。我面临的问题是,在第一次尝试时,它无法连接设备并说“#34; Pairing Rejected"”。然后成功连接。

这是我的代码:

package rockwellcollins.bluetooth_pairing_siu;

import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    public ServerSocket serverSocket;
    public BluetoothA2dp btA2dp;
    BluetoothAdapter mBluetoothAdapter;
    private BluetoothSocket mSocket = null;
    private UUID applicationUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    public InetAddress serverAddr,serverAddrConnected;
    public Socket socket,socketConnected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        mBluetoothAdapter   = BluetoothAdapter.getDefaultAdapter();
        mBluetoothAdapter.getProfileProxy(this, new BluetoothProfile.ServiceListener() {
            @Override
            public void onServiceConnected(int profile, BluetoothProfile proxy) {
                Log.i("oncreate","Bluetooth Service connected.\n");
                btA2dp = (BluetoothA2dp) proxy;
            }

            @Override
            public void onServiceDisconnected(int profile) {
                Log.i("oncreate", "Bluetooth Service disconnected.\n");
            }
        }, BluetoothProfile.A2DP);

        Log.i("oncreate", "going to start thread.\n");
        Thread fst = new Thread(new ServerThread());
        fst.start();
        registerReceiver(mPairReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED));
    }

    public class ServerThread implements Runnable
    {
        String[] strLine;
        @Override
        public void run() {
            try {
                mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                serverSocket = new ServerSocket(4500);
                while(true) {
                    Log.i("inrun","in run method");
                    Socket client = serverSocket.accept();
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String line = in.readLine();

                    strLine = line.split(";");
                    Log.i("ServerThread", "Line is: " + strLine[1]);
                    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(strLine[1]);
                    if(strLine[0].contains("connect")) {
                        pairDevice(device);
                    }
                    else if(strLine[0].contains("unpair"))
                    {
                        Log.i("run","Going to unpair device");
                        unpairDevice(device, strLine[2]);

                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void pairDevice(BluetoothDevice device) {

        try {
            if(device.getBondState() == BluetoothDevice.BOND_NONE) {
                Method method = device.getClass().getMethod("createBond", (Class[]) null);
                method.invoke(device, (Object[]) null);
                Log.d("pairdevice", String.valueOf(device.getBondState()));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class FinalThread implements Runnable{

        String strMsg = "";
        public FinalThread(String msg)
        {
            strMsg = msg;
        }
        @Override
        public void run() {
            try {

                serverAddr = InetAddress.getByName("10.240.8.23");
                socket = new Socket(serverAddr,5500);

                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println(strMsg);
                out.flush();
                socket.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void unpairDevice(BluetoothDevice device, String seatInfo) {
        try {
            if(device.getBondState() == BluetoothDevice.BOND_BONDED) {
                Method method = device.getClass().getMethod("removeBond", (Class[]) null);
                method.invoke(device, (Object[]) null);
            }
            Thread sThread = new Thread(new ConnectThread(seatInfo));
            sThread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class ConnectThread implements Runnable{
        String strSeat = "";
        public ConnectThread(String seat){
            strSeat = seat;
        }
        @Override
        public void run() {
            try {

                Log.i("ConnectThread","Going to connect");
                serverAddr = InetAddress.getByName("10.240.8.23");
                socket = new Socket(serverAddr,5500);

                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println("startpairconnect;" + strSeat);
                out.flush();
                socket.close();
                Log.i("ConnectThread","Send message back for connect");

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private final BroadcastReceiver mPairReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            BluetoothDevice deviceBT = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                final int state         = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
                final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);

                if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) {
                    ShowToast("Paired");
                    connectA2dp(deviceBT);
                } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){
                    ShowToast("Unpaired");
                } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDING){
                    ShowToast("Pairing rejected, trying again");
                    pairDevice(deviceBT);
                }

            }
        }
    };
    private void connectA2dp(final BluetoothDevice btdevice) {
        Method connect;
        String strMessage = "";
        try {
            connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);
            //Log.i("connecta2dp","get connect method " + connect);
        } catch (NoSuchMethodException ex) {
            Log.e("connectA2dp", "Unable to find connect(BluetoothDevice) method in BluetoothA2dp proxy.");

            return;
        }
        connect.setAccessible(true);
        try {
            //Log.i("connecta2dp","before invoke" );
            connect.invoke(btA2dp, btdevice);
            if(btdevice.getBondState() == BluetoothDevice.BOND_BONDED)
                strMessage = "success;" + btdevice.getAddress();
            else
                strMessage = "failure";

            Thread fThread = new Thread(new FinalThread(strMessage));
            fThread.start();
            //Log.i("connecta2dp", "after invoke");
        } catch (InvocationTargetException ex) {
            Log.e("connectA2dp", "Unable to invoke connect(BluetoothDevice) method on proxy. " + ex.toString());
        } catch (IllegalAccessException ex) {
            Log.e("connectA2dp", "Illegal Access! " + ex.toString());
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
    public void ShowToast(String message)
    {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

对几次拒绝配对的场景的一点解释都会在它上面创建一个onCreate方法的线程。现在这个线程将持续监视端口以获取传入消息,一旦获得消息它&# 39; ll从中提取耳机的mac地址。一旦它获得了mac地址,它就会尝试以编程方式连接它,在它失败几次尝试然后成功连接它。

由于

0 个答案:

没有答案
相关问题