如何使用Android 2.1 SDK取消配对蓝牙设备

10
在Android 2.1中,要取消配对蓝牙设备,您可以进入蓝牙设置,长按设备并选择“取消配对”以取消配对该设备。我希望能够从我的应用程序中执行此操作。我可以使用 BluetoothAdapter.getBondedDevices()获取配对/绑定设备列表,但我找不到如何取消配对的方法。我已经探索了BluetoothChat示例,并搜索了sdk,但仍然找不到允许此操作的API。
如何取消配对蓝牙设备?
4个回答

11

以下是如何取消配对/移除已绑定设备的方法,调用此方法时,其中macAddress为设备的MAC地址字符串,例如:"00:02:00:A3:03:05"

IBluetooth ib =getIBluetooth();
ib.removeBond(macAddress);

要获取IBluetooth对象,您需要经过几个步骤

  1. 在您的项目中创建名为android.bluetooth的包
  2. 创建两个文件:IBluetooth.aidl和IBluetoothCallback.aidl
  3. 在您的文件中创建名为getBluetooth()的方法

private IBluetooth getIBluetooth() {
IBluetooth ibt = null;

try {

    Class c2 = Class.forName("android.os.ServiceManager");

    Method m2 = c2.getDeclaredMethod("getService",String.class);
    IBinder b = (IBinder) m2.invoke(null, "bluetooth");

    Class c3 = Class.forName("android.bluetooth.IBluetooth");

    Class[] s2 = c3.getDeclaredClasses();

    Class c = s2[0];
    Method m = c.getDeclaredMethod("asInterface",IBinder.class);
    m.setAccessible(true);
    ibt = (IBluetooth) m.invoke(null, b);


} catch (Exception e) {
    Log.e("flowlab", "Erroraco!!! " + e.getMessage());
}

return ibt;
}

/************ IBluetooth.aidl ************/

package android.bluetooth;

import android.bluetooth.IBluetoothCallback;
import android.os.ParcelUuid;

/**
  * System private API for talking with the Bluetooth service.
  *
  * {@hide}
  */
 interface IBluetooth
 {
   boolean isEnabled();
   int getBluetoothState();
   boolean enable();
   boolean disable(boolean persistSetting);

   String getAddress();
   String getName();
   boolean setName(in String name);

   int getScanMode();
   boolean setScanMode(int mode, int duration);

   int getDiscoverableTimeout();
   boolean setDiscoverableTimeout(int timeout);

   boolean startDiscovery();
   boolean cancelDiscovery();
   boolean isDiscovering();

   boolean createBond(in String address);
   boolean cancelBondProcess(in String address);
   boolean removeBond(in String address);
   String[] listBonds();
   int getBondState(in String address);

   String getRemoteName(in String address);
   int getRemoteClass(in String address);
   ParcelUuid[] getRemoteUuids(in String address);
   boolean fetchRemoteUuids(in String address, in ParcelUuid uuid, in IBluetoothCallback callback);
   int getRemoteServiceChannel(in String address, in ParcelUuid uuid);

   boolean setPin(in String address, in byte[] pin);
   boolean setPasskey(in String address, int passkey);
   boolean setPairingConfirmation(in String address, boolean confirm);
   boolean cancelPairingUserInput(in String address);

   boolean setTrust(in String address, in boolean value);
   boolean getTrustState(in String address);

   int addRfcommServiceRecord(in String serviceName, in ParcelUuid uuid, int channel, IBinder b);
   void removeServiceRecord(int handle);
}

/************ IBluetoothCallback.aidl ************/

    package android.bluetooth;

    /**
     * System private API for Bluetooth service callbacks.
     *
     * {@hide}
     */
    interface IBluetoothCallback
    {
        void onRfcommChannelFound(int channel);
    }

请问您能否将这个包打包成一个zip文件并分享给我吗? - Majid Golshadi
抱歉我的无知,但我不理解第三点:“在您的文件中创建名为getBluetooth()的方法”?那在哪里?为什么会出现“无法解析符号IBluetooth”的情况? - Sebastien FERRAND
我写这个已经有6年了...我不记得更细节的部分了。很可能你的IBlueTooth.aidl文件没有放在正确的位置或者没有在构建脚本中导入。 - JPM

3

另一种方法:

public void clear(View v) {
    Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices();
    try {
        Class<?> btDeviceInstance =  Class.forName(BluetoothDevice.class.getCanonicalName());
        Method removeBondMethod = btDeviceInstance.getMethod("removeBond");
        String currentMac = getCurrentMAC();
        boolean cleared = false;
                for (BluetoothDevice bluetoothDevice : bondedDevices) {
            String mac = bluetoothDevice.getAddress();
            if(mac.equals(currentMac)) {
                removeBondMethod.invoke(bluetoothDevice);
                Log.i(TAG,"Cleared Pairing");
                cleared = true;
                break;
            }
        }

                if(!cleared) {
            Log.i(TAG,"Not Paired");
                }
    } catch (Throwable th) {
        Log.e(TAG, "Error pairing", th);
    }
}

1
谢谢!这对我非常有效!“removeBond(BluetoothDevice device)”方法定义在哪里?为什么我们必须调用反射来调用它? - ossys
嘿d3n13d1,我尝试了这个方法,但在API 24及以上版本上无法工作,你能否提供任何替代方法?谢谢。 - umesh
我只使用过与版本16和17构建的apk,但它在我的像素上运行良好。 - d3n13d1

1

您可以通过此方法将用户发送到蓝牙设置页面,从而可以取消配对已配对的设备。 Intent intentOpenBluetoothSettings = new Intent(); intentOpenBluetoothSettings.setAction(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); startActivity(intentOpenBluetoothSettings);


请解释一下你的代码,以便其他用户能够理解它的功能。谢谢! - Ignacio Ara
@IgnacioAra,每当最终用户点击“扫描设备”按钮时,我们会将他发送到蓝牙设置意图。他可以从那里配对设备并返回应用程序。 - Mohd Qasim

0

可以通过Droid Java手动取消配对设备。

您可以调用隐藏的方法来删除绑定。


可能需要询问更多问题或在此网站上搜索,但我上面提供的建议是我找到的编程解除配对的方法。要手动解除配对,您可以使用手机中已经存在的蓝牙程序。 - JPM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接