《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 設(shè)計(jì)應(yīng)用 > Android提高之探秘藍(lán)牙隱藏API
Android提高之探秘藍(lán)牙隱藏API
摘要: 本文探討下藍(lán)牙方面的隱藏API。用過(guò)Android系統(tǒng)設(shè)置(Setting)的人都知道藍(lán)牙搜索之后可以建立配對(duì)和解除配對(duì),但是這兩項(xiàng)功能的函數(shù)沒有在SDK中給出,那么如何去使用這兩項(xiàng)功能呢?
關(guān)鍵詞: 接口IC Android 藍(lán)牙 API
Abstract:
Key words :

本文探討下藍(lán)牙方面的隱藏API。用過(guò)Android系統(tǒng)設(shè)置(Setting)的人都知道藍(lán)牙搜索之后可以建立配對(duì)和解除配對(duì),但是這兩項(xiàng)功能的函數(shù)沒有在SDK中給出,那么如何去使用這兩項(xiàng)功能呢?本文利用JAVA的反射機(jī)制去調(diào)用這兩項(xiàng)功能對(duì)應(yīng)的函數(shù):createBond和removeBond,具體的發(fā)掘和實(shí)現(xiàn)步驟如下:

1.使用Git工具下載platform/packages/apps/Settings.git,在Setting源碼中查找關(guān)于建立配對(duì)和解除配對(duì)的API,知道這兩個(gè)API的宿主(BluetoothDevice);

2.使用反射機(jī)制對(duì)BluetoothDevice枚舉其所有方法和常量,看看是否存在:

view plaincopy to clipboardprint?
static public void printAllInform(Class clsShow) {  
    try {  
        // 取得所有方法  
        Method[] hideMethod = clsShow.getMethods();  
        int i = 0;  
        for (; i < hideMethod.length; i++) {  
            Log.e("method name", hideMethod[i].getName());  
        }  
        // 取得所有常量  
        Field[] allFields = clsShow.getFields();  
        for (i = 0; i < allFields.length; i++) {  
            Log.e("Field name", allFields[i].getName());  
        }  
    } catch (SecurityException e) {  
        // throw new RuntimeException(e.getMessage());  
        e.printStackTrace();  
    } catch (IllegalArgumentException e) {  
        // throw new RuntimeException(e.getMessage());  
        e.printStackTrace();  
    } catch (Exception e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  

 static public void printAllInform(Class clsShow) {
  try {
   // 取得所有方法
   Method[] hideMethod = clsShow.getMethods();
   int i = 0;
   for (; i < hideMethod.length; i++) {
    Log.e("method name", hideMethod[i].getName());
   }
   // 取得所有常量
   Field[] allFields = clsShow.getFields();
   for (i = 0; i < allFields.length; i++) {
    Log.e("Field name", allFields[i].getName());
   }
  } catch (SecurityException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } 

結(jié)果如下:

11-29 09:19:12.012: method name(452): cancelBondProcess
11-29 09:19:12.020: method name(452): cancelPairingUserInput
11-29 09:19:12.020: method name(452): createBond
11-29 09:19:12.020: method name(452): createInsecureRfcommSocket
11-29 09:19:12.027: method name(452): createRfcommSocket
11-29 09:19:12.027: method name(452): createRfcommSocketToServiceRecord
11-29 09:19:12.027: method name(452): createScoSocket
11-29 09:19:12.027: method name(452): describeContents
11-29 09:19:12.035: method name(452): equals
11-29 09:19:12.035: method name(452): fetchUuidsWithSdp
11-29 09:19:12.035: method name(452): getAddress
11-29 09:19:12.035: method name(452): getBluetoothClass
11-29 09:19:12.043: method name(452): getBondState
11-29 09:19:12.043: method name(452): getName
11-29 09:19:12.043: method name(452): getServiceChannel
11-29 09:19:12.043: method name(452): getTrustState
11-29 09:19:12.043: method name(452): getUuids
11-29 09:19:12.043: method name(452): hashCode
11-29 09:19:12.043: method name(452): isBluetoothDock
11-29 09:19:12.043: method name(452): removeBond
11-29 09:19:12.043: method name(452): setPairingConfirmation
11-29 09:19:12.043: method name(452): setPasskey
11-29 09:19:12.043: method name(452): setPin
11-29 09:19:12.043: method name(452): setTrust
11-29 09:19:12.043: method name(452): toString
11-29 09:19:12.043: method name(452): writeToParcel
11-29 09:19:12.043: method name(452): convertPinToBytes
11-29 09:19:12.043: method name(452): getClass
11-29 09:19:12.043: method name(452): notify
11-29 09:19:12.043: method name(452): notifyAll
11-29 09:19:12.043: method name(452): wait
11-29 09:19:12.051: method name(452): wait
11-29 09:19:12.051: method name(452): wait

3.如果枚舉發(fā)現(xiàn)API存在(SDK卻隱藏),則自己實(shí)現(xiàn)調(diào)用方法:

view plaincopy to clipboardprint?
/** 
 * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git 
 * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
 */ 
static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
    Method createBondMethod = btClass.getMethod("createBond");  
    Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
    return returnValue.booleanValue();  
}  
 
/** 
 * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git 
 * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
 */ 
static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
    Method removeBondMethod = btClass.getMethod("removeBond");  
    Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);  
    return returnValue.booleanValue();  

 /**
  * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method createBondMethod = btClass.getMethod("createBond");
  Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

 /**
  * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method removeBondMethod = btClass.getMethod("removeBond");
  Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

PS:SDK之所以不給出隱藏的API肯定有其原因,也許是出于安全性或者是后續(xù)版本兼容性的考慮,因此不能保證隱藏API能在所有Android平臺(tái)上很好地運(yùn)行。。。

本文程序運(yùn)行效果如下:

main.xml源碼如下:

view plaincopy to clipboardprint?
 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
            android:layout_height="wrap_content" android:layout_width="fill_parent"> 
        
        
     
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            android:layout_height="fill_parent"> 
     
 

 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
   android:layout_height="wrap_content" android:layout_width="fill_parent">
  
  
 
   android:layout_width="wrap_content" android:layout_height="wrap_content">
   android:layout_height="fill_parent">
 

 

工具類ClsUtils.java源碼如下:

view plaincopy to clipboardprint?
package com.testReflect;  
 
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
 
import android.bluetooth.BluetoothDevice;  
import android.util.Log;  
 
public class ClsUtils {   
  

本文探討下藍(lán)牙方面的隱藏API。用過(guò)Android系統(tǒng)設(shè)置(Setting)的人都知道藍(lán)牙搜索之后可以建立配對(duì)和解除配對(duì),但是這兩項(xiàng)功能的函數(shù)沒有在SDK中給出,那么如何去使用這兩項(xiàng)功能呢?本文利用JAVA的反射機(jī)制去調(diào)用這兩項(xiàng)功能對(duì)應(yīng)的函數(shù):createBond和removeBond,具體的發(fā)掘和實(shí)現(xiàn)步驟如下:

1.使用Git工具下載platform/packages/apps/Settings.git,在Setting源碼中查找關(guān)于建立配對(duì)和解除配對(duì)的API,知道這兩個(gè)API的宿主(BluetoothDevice);

2.使用反射機(jī)制對(duì)BluetoothDevice枚舉其所有方法和常量,看看是否存在:

view plaincopy to clipboardprint?
static public void printAllInform(Class clsShow) {  
    try {  
        // 取得所有方法  
        Method[] hideMethod = clsShow.getMethods();  
        int i = 0;  
        for (; i < hideMethod.length; i++) {  
            Log.e("method name", hideMethod[i].getName());  
        }  
        // 取得所有常量  
        Field[] allFields = clsShow.getFields();  
        for (i = 0; i < allFields.length; i++) {  
            Log.e("Field name", allFields[i].getName());  
        }  
    } catch (SecurityException e) {  
        // throw new RuntimeException(e.getMessage());  
        e.printStackTrace();  
    } catch (IllegalArgumentException e) {  
        // throw new RuntimeException(e.getMessage());  
        e.printStackTrace();  
    } catch (Exception e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  

 static public void printAllInform(Class clsShow) {
  try {
   // 取得所有方法
   Method[] hideMethod = clsShow.getMethods();
   int i = 0;
   for (; i < hideMethod.length; i++) {
    Log.e("method name", hideMethod[i].getName());
   }
   // 取得所有常量
   Field[] allFields = clsShow.getFields();
   for (i = 0; i < allFields.length; i++) {
    Log.e("Field name", allFields[i].getName());
   }
  } catch (SecurityException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } 

結(jié)果如下:

11-29 09:19:12.012: method name(452): cancelBondProcess
11-29 09:19:12.020: method name(452): cancelPairingUserInput
11-29 09:19:12.020: method name(452): createBond
11-29 09:19:12.020: method name(452): createInsecureRfcommSocket
11-29 09:19:12.027: method name(452): createRfcommSocket
11-29 09:19:12.027: method name(452): createRfcommSocketToServiceRecord
11-29 09:19:12.027: method name(452): createScoSocket
11-29 09:19:12.027: method name(452): describeContents
11-29 09:19:12.035: method name(452): equals
11-29 09:19:12.035: method name(452): fetchUuidsWithSdp
11-29 09:19:12.035: method name(452): getAddress
11-29 09:19:12.035: method name(452): getBluetoothClass
11-29 09:19:12.043: method name(452): getBondState
11-29 09:19:12.043: method name(452): getName
11-29 09:19:12.043: method name(452): getServiceChannel
11-29 09:19:12.043: method name(452): getTrustState
11-29 09:19:12.043: method name(452): getUuids
11-29 09:19:12.043: method name(452): hashCode
11-29 09:19:12.043: method name(452): isBluetoothDock
11-29 09:19:12.043: method name(452): removeBond
11-29 09:19:12.043: method name(452): setPairingConfirmation
11-29 09:19:12.043: method name(452): setPasskey
11-29 09:19:12.043: method name(452): setPin
11-29 09:19:12.043: method name(452): setTrust
11-29 09:19:12.043: method name(452): toString
11-29 09:19:12.043: method name(452): writeToParcel
11-29 09:19:12.043: method name(452): convertPinToBytes
11-29 09:19:12.043: method name(452): getClass
11-29 09:19:12.043: method name(452): notify
11-29 09:19:12.043: method name(452): notifyAll
11-29 09:19:12.043: method name(452): wait
11-29 09:19:12.051: method name(452): wait
11-29 09:19:12.051: method name(452): wait

3.如果枚舉發(fā)現(xiàn)API存在(SDK卻隱藏),則自己實(shí)現(xiàn)調(diào)用方法:

view plaincopy to clipboardprint?
/** 
 * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git 
 * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
 */ 
static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
    Method createBondMethod = btClass.getMethod("createBond");  
    Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
    return returnValue.booleanValue();  
}  
 
/** 
 * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git 
 * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
 */ 
static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
    Method removeBondMethod = btClass.getMethod("removeBond");  
    Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);  
    return returnValue.booleanValue();  

 /**
  * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method createBondMethod = btClass.getMethod("createBond");
  Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

 /**
  * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method removeBondMethod = btClass.getMethod("removeBond");
  Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

PS:SDK之所以不給出隱藏的API肯定有其原因,也許是出于安全性或者是后續(xù)版本兼容性的考慮,因此不能保證隱藏API能在所有Android平臺(tái)上很好地運(yùn)行。。。

本文程序運(yùn)行效果如下:

main.xml源碼如下:

view plaincopy to clipboardprint?
 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
            android:layout_height="wrap_content" android:layout_width="fill_parent"> 
        
        
     
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            android:layout_height="fill_parent"> 
     
 

 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
   android:layout_height="wrap_content" android:layout_width="fill_parent">
  
  
 
   android:layout_width="wrap_content" android:layout_height="wrap_content">
   android:layout_height="fill_parent">
 

 

工具類ClsUtils.java源碼如下:

view plaincopy to clipboardprint?
package com.testReflect;  
 
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
 
import android.bluetooth.BluetoothDevice;  
import android.util.Log;  
 
public class ClsUtils {   
  


    /** 
     * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git 
     * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
     */ 
    static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
        Method createBondMethod = btClass.getMethod("createBond");  
        Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
        return returnValue.booleanValue();  
    }  
 
    /** 
     * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git 
     * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java 
     */ 
    static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {  
        Method removeBondMethod = btClass.getMethod("removeBond");  
        Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);  
        return returnValue.booleanValue();  
    }  
 
    /** 
     *  
     * @param clsShow 
     */ 
    static public void printAllInform(Class clsShow) {  
        try {  
            // 取得所有方法  
            Method[] hideMethod = clsShow.getMethods();  
            int i = 0;  
            for (; i < hideMethod.length; i++) {  
                Log.e("method name", hideMethod[i].getName());  
            }  
            // 取得所有常量  
            Field[] allFields = clsShow.getFields();  
            for (i = 0; i < allFields.length; i++) {  
                Log.e("Field name", allFields[i].getName());  
            }  
        } catch (SecurityException e) {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        } catch (IllegalArgumentException e) {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  

package com.testReflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.bluetooth.BluetoothDevice;
import android.util.Log;

public class ClsUtils {

 /**
  * 與設(shè)備配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean createBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method createBondMethod = btClass.getMethod("createBond");
  Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

 /**
  * 與設(shè)備解除配對(duì) 參考源碼:platform/packages/apps/Settings.git
  * \Settings\src\com\android\settings\bluetooth\CachedBluetoothDevice.java
  */
 static public boolean removeBond(Class btClass,BluetoothDevice btDevice) throws Exception {
  Method removeBondMethod = btClass.getMethod("removeBond");
  Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
  return returnValue.booleanValue();
 }

 /**
  *
  * @param clsShow
  */
 static public void printAllInform(Class clsShow) {
  try {
   // 取得所有方法
   Method[] hideMethod = clsShow.getMethods();
   int i = 0;
   for (; i < hideMethod.length; i++) {
    Log.e("method name", hideMethod[i].getName());
   }
   // 取得所有常量
   Field[] allFields = clsShow.getFields();
   for (i = 0; i < allFields.length; i++) {
    Log.e("Field name", allFields[i].getName());
   }
  } catch (SecurityException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (IllegalArgumentException e) {
   // throw new RuntimeException(e.getMessage());
   e.printStackTrace();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}
 

主程序testReflect.java的源碼如下:

view plaincopy to clipboardprint?
package com.testReflect;  
 
import java.util.ArrayList;  
import java.util.List;  
import android.app.Activity;  
import android.bluetooth.BluetoothAdapter;  
import android.bluetooth.BluetoothDevice;  
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import android.content.IntentFilter;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ArrayAdapter;  
import android.widget.Button;  
import android.widget.ListView;  
import android.widget.Toast;  
 
public class testReflect extends Activity {  
    Button btnSearch, btnShow;  
    ListView lvBTDevices;  
    ArrayAdapter adtDevices;  
    List lstDevices = new ArrayList();  
    BluetoothDevice btDevice;  
    BluetoothAdapter btAdapt;  
 
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
 
        btnSearch = (Button) this.findViewById(R.id.btnSearch);  
        btnSearch.setOnClickListener(new ClickEvent());  
        btnShow = (Button) this.findViewById(R.id.btnShow);  
        btnShow.setOnClickListener(new ClickEvent());  
 
        lvBTDevices = (ListView) this.findViewById(R.id.ListView01);  
        adtDevices = new ArrayAdapter(testReflect.this,  
                android.R.layout.simple_list_item_1, lstDevices);  
        lvBTDevices.setAdapter(adtDevices);  
        lvBTDevices.setOnItemClickListener(new ItemClickEvent());  
 
        btAdapt = BluetoothAdapter.getDefaultAdapter();// 初始化本機(jī)藍(lán)牙功能  
        if (btAdapt.getState() == BluetoothAdapter.STATE_OFF)// 開藍(lán)牙  
            btAdapt.enable();  
 
        // 注冊(cè)Receiver來(lái)獲取藍(lán)牙設(shè)備相關(guān)的結(jié)果  
        IntentFilter intent = new IntentFilter();  
        intent.addAction(BluetoothDevice.ACTION_FOUND);  
        intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  
        registerReceiver(searchDevices, intent);  
 
    }   
  


       
    private BroadcastReceiver searchDevices = new BroadcastReceiver() {  
        public void onReceive(Context context, Intent intent) {  
            String action = intent.getAction();  
            Bundle b = intent.getExtras();  
            Object[] lstName = b.keySet().toArray();  
 
            // 顯示所有收到的消息及其細(xì)節(jié)  
            for (int i = 0; i < lstName.length; i++) {  
                String keyName = lstName[i].toString();  
                Log.e(keyName, String.valueOf(b.get(keyName)));  
            }  
            // 搜索設(shè)備時(shí),取得設(shè)備的MAC地址  
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {  
                BluetoothDevice device = intent  
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
 
                if (device.getBondState() == BluetoothDevice.BOND_NONE) {  
                    String str = "未配對(duì)|" + device.getName() + "|" + device.getAddress();  
                    lstDevices.add(str); // 獲取設(shè)備名稱和mac地址  
                    adtDevices.notifyDataSetChanged();  
                }  
            }  
        }  
    };  
 
    class ItemClickEvent implements AdapterView.OnItemClickListener {  
 
        @Override 
        public void onItemClick(AdapterView arg0, View arg1, int arg2,  
                long arg3) {  
            btAdapt.cancelDiscovery();  
            String str = lstDevices.get(arg2);  
            String[] values = str.split("\\|");  
            String address=values[2];  
 
            btDevice = btAdapt.getRemoteDevice(address);  
            try {  
                if(values[0].equals("未配對(duì)"))  
                {     
                    Toast.makeText(testReflect.this, "由未配對(duì)轉(zhuǎn)為已配對(duì)", 500).show();  
                    ClsUtils.createBond(btDevice.getClass(), btDevice);  
                }  
                else if(values[0].equals("已配對(duì)"))  
                {  
                    Toast.makeText(testReflect.this, "由已配對(duì)轉(zhuǎn)為未配對(duì)", 500).show();  
                    ClsUtils.removeBond(btDevice.getClass(), btDevice);  
                }  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
          
    }  
      
    /** 
     * 按鍵處理 
     * @author GV 
     * 
     */ 
    class ClickEvent implements View.OnClickListener {  
 
        @Override 
        public void onClick(View v) {  
            if (v == btnSearch) {//搜索附近的藍(lán)牙設(shè)備  
                lstDevices.clear();  
                  
                Object[] lstDevice = btAdapt.getBondedDevices().toArray();  
                for (int i = 0; i < lstDevice.length; i++) {  
                    BluetoothDevice device=(BluetoothDevice)lstDevice[i];  
                    String str = "已配對(duì)|" + device.getName() + "|" + device.getAddress();  
                    lstDevices.add(str); // 獲取設(shè)備名稱和mac地址  
                    adtDevices.notifyDataSetChanged();  
                }  
                // 開始搜索  
                setTitle("本機(jī)藍(lán)牙地址:" + btAdapt.getAddress());  
                btAdapt.startDiscovery();  
            }  
            else if(v==btnShow){//顯示BluetoothDevice的所有方法和常量,包括隱藏API  
                ClsUtils.printAllInform(btDevice.getClass());  
            }  
 
        }  
 
    }  
 
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
主站蜘蛛池模板: 国产一区二区三区成人欧美日韩在线观看 | 91亚色网站 | 日本一道高清一区二区三区 | 天堂成人在线视频 | 国产日韩精品视频一区二区三区 | 亚洲美女爱爱 | 天天插日日干 | 日韩在线二区 | 在线国精产品 | 日日操夜夜干 | 国产成人无码精品一区在线观看 | 国产在线视频网站 | 北京少妇宾馆露脸对白 | 青青操视频在线 | 色婷婷综合久久久久中文字幕 | 国产精品女同一区二区 | 一级黄色在线 | 无码人妻一区二区三区免费视频 | 欧美视频一区二区在线观看 | 国产视频一二区 | 亚洲の无码国产の无码影院 | 刘亦菲毛片一区二区三区 | 57pao国产成永久免费视频 | 色婷婷18| 18禁毛片无遮挡嫩草视频 | 美女视频久久久 | 337p日本欧洲亚洲大胆张筱雨 | 中文字幕亚洲综合久久 | 美女av在线播放 | 免费a级毛片在线播放 | 又色又爽又高潮免费视频国产 | 粉嫩av久久一区二区三区 | 欧美极品jizzhd欧美仙踪林 | 中文字幕在线观看日韩 | 久久人妻无码中文字幕 | 可以直接免费观看的av网站 | 成人精品水蜜桃 | 久久精品中文字幕 | 欧美国产在线一区 | 香蕉视频2020 | 成人xx视频 | 国产无遮挡又黄又爽在线观看 | 伊人色综合久久天天网 | 欧美老妇人与禽交 | 激情亚洲一区国产精品 | 亚洲欧美日韩精品久久 | 性久久久久久久久波多野结衣 | 国产图区 | 色啊色 | 久久福利精品 | 国产丝袜一区二区三区免费视频 | 一级特黄aa大片 | 久久久久琪琪去精品色无码 | 成人欧美一区二区三区 | 午夜福利在线永久视频 | 拧花蒂尿用力按凸起喷水尿一区 | 淫欲的代价k8经典网 | 日韩视频精品 | 日本韩国免费观看 | 51精品国产 | 日本无遮羞打屁股网站视频 | aaa一区二区三区 | 欧美激情黑白配 | 2级黄色片 | 日本黄色www | 3d动漫精品啪啪一区二区下载 | 午夜视频在线观看国产 | 国产98在线传媒麻豆有限公司 | 一黄色大片 | 豆国产95在线 | 亚洲 | 亚洲国产精品一区二区成人片国内 | 国产欧美一区二区精品性色超碰 | 国产一区二区三区在线电影 | 动漫3d精品一区二区三区乱码 | 中国女人内谢69xxxx免费视频 | 性国产丰满麻豆videosex | hd最新国产人妖ts视频仙踪林 | 99精品热6080yy久久日韩 | 91久久国产最好的精华液 | 亚洲视频成人 | 久久久18| 麻豆天美传媒毛片av88 | 国产不卡在线 | 国产免费自拍视频 | 色偷偷88888欧美精品久久久 | 午夜视频在线观看一区二区 | 国产精品视频h | 日日摸夜夜摸狠狠摸婷婷 | 男女18禁啪啪无遮挡激烈网站 | 中文字字幕在线 | 亚洲欧洲在线视频 | 久久99深爱久久99精品 | 国产亚洲精品久久yy50 | 国产成人资源 | 精品国产亚洲一区二区三区 | 天天av天天干| 国产成人在线视频播放 | 无遮无挡爽爽免费视频 | 久久69精品久久久久久国产越南 | 成人黄色动漫在线观看 | 无码人妻视频一区二区三区 | 在线天堂中文 | 日韩国产免费 | 99热自拍偷拍 | 综合天堂av久久久久久久 | 激情射精爽到偷偷c视频无码 | 少妇午夜啪爽嗷嗷叫视频 | 亚洲国产精品成人久久 | 亚洲精品一| 91在线看片| 在线观看wwww | 国产三级理论 | 91网址入口 | 欧美14一18处毛片 | 欧美日韩1| 9色视频| 成人国产精品久久久按摩 | 中文字幕亚洲综合久久综合 | 亚洲免费国产 | 久久亚洲在线 | 国产美女无遮挡永久免费 | 日本女人黄色 | 69天堂网 | 日日碰狠狠躁久久躁综合小说 | 国产成人精品综合在线观看 | 全黄h全肉短篇禁乱最新章节 | av手机在线免费观看 | www.久久久久久 | 青青草精品在线视频 | www国产精品内射熟女 | 久久精品欧美一区二区 | 少妇人妻系列无码专区视频 | 久久精品国产片 | 97成人超碰 | av大全在线播放 | 成人一级片 | 精品国产99高清一区二区三区 | 秋霞av亚洲一区二区三 | 国产娇喘精品一区二区三区图片 | 国产成人精品久久二区二区91 | 成人国产精品蜜柚视频 | 亚洲综合在线免费 | 九九九伊在人现综合 | 一本加勒比hezyo东京图库 | 999毛片| 内射国产内射夫妻免费频道 | 丰满少妇高潮惨叫久久久久 | 亚洲精品www久久久久久 | 久久久噜噜噜www成人网 | xxx国产老太婆视频 xxx精品 | 欧美精品久久久久久久监狱 | 精品人妻系列无码专区 | 欧美一区1区三区3区公司 | 蜜桃精品视频在线 | 大地资源中文第三页 | 国产精品毛片在线完整版 | 国产视频入口 | 好色成人网 | 久久99精品久久久久久9 | 一级片麻豆 | 超碰精品 | 日日噜夜夜噜 | 欧美日韩一区二区三 | 蜜桃视频一区二区 | 日日噜噜夜夜狠狠va视频 | 99国产精品99久久久久久粉嫩 | 国产精品久久久久久久久岛 | 无套内谢孕妇毛片免费看看 | 超碰免费公开在线 | 亚洲成人一区 | 狠狠色噜噜狠狠色综合久 | 亚洲欧洲av在线 | 制服丝袜在线第一页 | 激情综合五月天 | 能看毛片的网站 | 欧美色图88 | 婷婷狠狠操 | 久久综合激激的五月天 | 日本熟妇色xxxxx欧美老妇 | 高辣h文乱乳h文男男双性视频 | 精品国产污污免费网站入口爱酱 | 色婷婷综合久久久中文一区二区 | 日本电影一区二区三区 | 亚洲一区二区影视 | 久久久久国产精品无码免费看 | 欧美一区1区三区3区公司 | 娇喘顶撞深初h1v1 | 一本一道精品欧美中文字幕 | 三级a视频 | 亚洲人成77777在线播放网站 | 68精品久久久久久欧美 | 韩国和日本免费不卡在线v 婷婷俺也去俺也去官网 | 国产区欧美区日韩区 | 色天天综合网 | 国产亚洲精久久久久久无码 | 亚洲视频一区在线 | 久久精品日日躁夜夜躁 | 天堂国产 | 夜夜高潮夜夜爽国产伦精品 | 国产95在线 | 欧美 | 尤物yw193无码点击进入 | 狠狠综合久久久久综合网址 | 日本美女日批视频 | 国产呻吟对白刺激无套视频在线 | 国产精品揄拍一区二区 | 色人阁五月 | 日本va欧美va欧美va精品 | 五月天国产精品 | 亚洲日韩看片无码超清 | 国产三区在线成人av | 亚洲欧洲免费无码 | 国产精品伦一区二区三级视频 | 日韩人妻少妇一区二区三区 | 三级黄片毛片 | 内射爽无广熟女亚洲 | 亚洲人亚洲人成电影网站色 | 特级黄色大片 | 高大丰满毛茸茸xxx性 | 夜夜春夜夜爽 | 特级丰满少妇一级aaa爱毛片 | 精品国产依人香蕉在线精品 | 日本成人一二三区 | 爆爽久久久一区二区又大又黄又嫩 | 91丨九色丨蝌蚪丨老板 | 欧美成人在线免费 | 午夜伦全在线观看 | 中文字幕第一页永久有效 | 婷婷亚洲五月 | 久久久久久久久久久小说 | 九色丨蝌蚪丨成人 | 久久精品无码精品免费专区 | a天堂中文在线 | 亚洲综合另类小说色区色噜噜 | 91精品国自产拍在线观看不卡 | 国产成人三级一区二区在线观看一 | 免费情侣作爱视频 | 日韩免费视频一区二区 | 粉嫩av一区二区夜夜嗨 | 日韩中文字幕国产 | 欧美自拍另类欧美综合图片区 | 亚洲天堂网络 | 中文字幕在线播放av | 91亚洲国产成人精品一区二区三 | 91在线精品一区二区 | 这里只有精品国产 | 免费黄色a级片 | 久久久久人妻啪啪一区二区 | 亚洲色大成网站www久久九九 | 蜜臀99久久精品久久久久久软件 | 成人h视频在线观看 | 欧美黑人激情性久久 | 亚洲粉嫩美女无套露脸 | 久久精品一区 | 青少年xxxxx性开放hg | 国产人妻大战黑人第1集 | 97久久人人 | 韩国三级中文字幕 | 超碰在线人人干 | 国产一区二区三区四区精 | 日韩欧美一中文字暮视频 | 91精品国产二区在线看大桥未久 | 国产日产欧产精品精品 | 午夜无码国产理论在线 | 精品国产乱码久久久久久三级人 | 日韩 欧美 | 国内精品自产拍在线观看 | av免费国产 | 亚洲国产成人久久综合一区,久久久国产99 | 成人网在线免费观看 | 色婷婷久久久久swag精品 | 国产一区91精品张津瑜 | 日本黄网站色大片免费观看 | 国产一区二区精品久久岳 | 亚洲成成品网站 | 久久久久网站 | 久久中文一区 | 极品少妇被啪到呻吟喷水 | 神马影院午夜伦理片 | 尤物视频网站在线观看 | 97无码人妻福利免费公开在线视频 | 私人毛片 | 97影院在线午夜 | 狠狠色丁香婷婷综合视频 | 国产免费高清av | 无码人妻丰满熟妇区五十路百度 | 欧美大尺度做爰啪啪床戏明星 | 久久6精品 | 女人裸体特黄做爰的视频 | 日本精品毛片一区视频播 | 日本三级三级三级三级 | 日本一级大黄毛片基地 | 成人爱爱aa啪啪看片 | 日日噜噜夜夜狠狠视频 | 欧产日产国产精品98 | 日本欧美久久久久免费播放网 | 一级色网站 | 九九人人 | 超碰男人的天堂 | 人妻熟女欲求不满在线 | 国产美女极度色诱视频www | 红桃17c视频永久免费入口 | 国产又粗又大又爽视频 | 97久久精品国产一区二区片 | 91美女在线视频 | 在线播放免费播放av片 | 国产又大又黑又粗 | 国产亚洲成av人在线观看导航 | 国产3p露脸普通话对白 | 中文字幕另类 | 国产av熟女一区二区三区 | 成av人片一区二区三区久久 | 久久精品99国产精 | 日韩精品在线观看一区二区 | 男人的天堂久久久 | 亚洲永久免费网站 | 成人在线观看视频网站 | 日韩有码av | 摸丰满大乳奶水www免费 | 国产影片中文字幕 | 老女人黄色片 | 欧美日本三级 | 欧美放荡的少妇 | 五月精品在线 | 一级一片免费看 | 99精品久久| 天干天干天啪啪夜爽爽av小说 | 欧美视频免费看欧美视频 | 99精品久久99久久久久 | 一本色道久久爱88av | 日本黄色毛片 | 国产乱视频 | 久久九九精品 | 强开小嫩苞一区二区三区网站 | 亚洲国产精品免费在线观看 | 强制中出し~大桥未久在线播放 | 日日夜夜一区二区 | 色偷偷av老熟女 | 免费看片在线观看www | 中文字幕免费一区 | 在线色导航 | 日本一码二码三码在线 | jvid精品视频hd在线 | 日本久操视频 | 人少妇精品123在线观看 | 国产女主播视频一区二区三区 | 国产欧美视频在线 | 欧美又大又色又爽bbbbb片 | 国产在线视频自拍 | 国产女人18水真多18精品一级做 | av涩涩| 第色| 久久66热人妻偷产精品 | 麻豆一区二区在我观看 | 久久密桃 | 一本色道久久综合亚洲精品小说 | 男人的天堂久久 | caoporn国产精品免费公开 | 性欧美激情 | 天天操天天玩 | 爱情岛论坛亚洲首页入口章节 | 精品久久久久久久久亚洲 | 天堂网av手机版 | 久久久久有精品国产麻豆 | 中文字幕永久在线视频 | 国产精品女同一区二区 | 深夜福利一区二区三区 | 日韩激情综合 | 久久精品国产久精国产 | 久久午夜夜伦鲁鲁片免费无码影视 | 国产欧美一区二区精品忘忧草 | 中文字幕二区三区 | 日日麻批免费40分钟无码 | 真人毛片高清免费播放 | 色视频在线观看 | tai9国产一区二区 | 日本一卡二卡不卡视频查询 | 极品久久久久久 | 国产乱子伦一区二区三区 | 中国少妇无码专区 | 综合久草| 中文字幕女教师julia视频 | 国内最真实的xxxx人伦 | 老女人激情视频 | 丰满少妇高潮久久三区 | 国产男女激情 | 亚洲精品日本无v一区 | 一区二区三区四区产品乱 | 美女国内精品自产拍在线播放 | 国产精品视频一区国模私拍 | 午夜激情看片 | 日韩av伦理| 免费h片网站 | 美女嘘嘘嘘aaaaaaaa级 | 国产免费一区二区三区在线能观看 | 长河落日电视连续剧免费观看01 | 视频一区二区国产 | 国产破苞第一次 | 新超碰97| 国产在线视频一区二区三区 | 奇米影视第四色7777 | 午夜啪啪福利视频 | 国产黄a三级三级三级av在线看 | yy6080午夜八戒国产亚洲 | 国产午夜精品一区理论片飘花 | 正在播放木下凛凛xv99 | 欧美一级淫片bbb一84 | 欧美一级在线播放 | avtt中文字幕| 久久精品亚洲a | 蜜桃一区二区三区 | 日本a级毛片视频播放 | 一级在线免费视频 | 国产98色在线 | 仁科百华av解禁在线播放 | 国产高潮久久 | 一本a道新久花碟 | 国产精品福利视频推女郎 | 99蜜桃在线观看免费视频网站 | 欧美视频一区二区三区在线观看 | 爱爱视频网站 | 日本少妇喂奶视频 | 国产又粗又长又硬免费视频 | 222aaa| 久久福利视频导航 | 一 级 黄 色 片免费网站 | 夜夜骑首页 | 亚洲自拍一区在线 | 狠狠干夜夜 | 攵女h高h1v1深与浅 | 欧美一区二区三区四区在线观看地址 | 国产又黄又大视频 | 巨大荫蒂视频欧美大片 | 九九视频网站 | 日本高清www色视频 国产一区日韩二区欧美三区 | 欧美在线一级片 | 在线观看国产视频 | 很黄很色60分钟在线观看 | 后入内射国产一区二区 | 天堂а√中文最新版地址在线 | 精品人妻少妇一区二区三区在线 | 无码免费一区二区三区免费播放 | 岛国精品一区 | 亚洲综合久久久久 | 奇米影视四色777 | 亚洲黄色小视频 | 91精彩视频在线观看 | 丝袜脚交国产在线观看 | 免费男性肉肉影院 | 欧美国产日本在线 | 最新色视频 | 国产精品久久久久久久久久久久冷 | 精品久久综合1区2区3区激情 | 成人国产精品视频国产 | 在线免费成人网 | 国产女主播视频一区二区三区 | 日韩视频无码中字免费观 | 中文在线www | 无码内射中文字幕岛国片 | 18一20岁毛毛片 | 91大神在线看 | 涩涩网站免费 | 日韩视频网 | 国产一卡二 | 中文字幕婷婷 | 久久图片视频 | 香蕉视频免费在线看 | 亚洲专区在线 | 青青草精品在线 | 久久综合另类激情人妖 | 国产精品无码午夜免费影院 | 国产精品亚洲视频 | 国产精品久久久久久久妇 | 中文在线a√在线 | 一木久道热线m38在线 | 免费黄av | 亚洲6080yy久久无码产自国产 | 国产精品不卡一区 | 国产精品片aa在线观看 | 久久久亚洲精品视频 | 91福利在线播放 | 无码成人1000部免费视频 | 深爱激情站 | 99精品欧美一区二区三区综合在线 | 加勒比久久久 | 4399午夜理伦免费播放大全 | 国产精品久久..4399 | 欧美精品久久久久久久久大尺度 | 国产9 9在线 | 中文 | 农村妇女愉情三级 | 亚洲视频高清 | 国产尤物av | 欧美一区二区三区免费看 | 欧美精品在线免费 | 99热这里只有精品7 99热这里只有精品8 | 国产98视频 | 草草浮力地址线路①屁屁影院 | 噜噜色图| 中文字幕一卡二卡三卡 | 婷婷天天 | 亚洲最大色大成人av | 18pao国产成人免费视频 | 国产色爱 | 婷婷五月花 | 久久99精品国产麻豆91樱花 | 久久躁狠狠躁夜夜av | 一本大道伊人av久久综合 | 色婷婷综合久久久中文字幕 | 亚洲天堂男 | 国产欧美精品一区二区三区四区 | 亚洲伦理在线视频 | 97成人精品视频在线播放 | 午夜免费网 | 伊人av综合| 99精品国产自在现线10页 | 干干操操 | 中文字幕人妻中文 | 福利片网址 | 国产真实伦种子 | 大桥未久av一区二区三区中文 | 国产成人精品一区二区三区在线 | 99精品欧美一区二区三区综合在线 | 成人在线视频观看 | 欧美另类性| 国产另类综合 | 日日碰狠狠躁久久躁蜜桃 | 日本三级在线 | 国产三男一女4p免费男黑人 | 久久午夜夜伦鲁鲁片无码免费 | 国产一级18片视频 | 亚洲女人天堂成人av在线 | 日本丰满大乳奶做爰 | 亚洲欧美视频 | 国产精品一区二区免费视频 | 黄色片视频免费观看 | 西野翔中文久久精品国产 | 尤物视频激情在线视频观看网站 | 日韩精品久久久久久久九岛 | 天天有av| 日本欧美国产一区二区三区 | 欧美日本在线观看 | 在线免费观看黄网 | 色噜噜狠狠狠综合曰曰曰 | 成人av在线一区二区三区 | 精品久久久久久无码中文野结衣 | www夜色| 老司机精品久久 | 女人18毛片毛片毛片毛片区二 | 久久久久久一区二区三区四区别墅 | 新x8x8拨牐拨牐永久免费影库 | 少妇被多人c夜夜爽爽 | 久久久av男人的天堂 | 97人人模人人爽人人喊网 | 欧美h在线观看 | 欧美顶级少妇做爰hd | 亚洲精品中文字幕乱码三区91 | 午夜在线国语中文字幕视频 | 午夜国产一区二区 | 在线观看www | 大香伊人中文字幕精品 | 亚洲精品无人区 | 久久久老司机 | 亚洲插插 | 午夜视频福利网站 | 久久婷婷五月综合色和啪 | av怡红院 | 亚洲精品午夜国产va久久成人 | 久久久黄色大片 | 亚洲第一色区 | 日日摸日日干 | 狠狠综合网 | 一本大道久久加勒比香蕉 | www国产成人| 邻居少妇张开双腿让我爽一夜图片 | 偷拍盗摄高潮叫床对白清晰 | 亚洲人成网亚洲欧洲无码 | 日本国产在线播放 | 久久久久国产精品www | 国产精品污污 | 后进极品白嫩翘臀在线视频 | 一本一道久久久a久久久精品蜜臀 | 日韩在线一二三区 | av在线入口 | 国产91精品在线观看 | 日韩bbw| 性色欲情网站 | 国产成人啪精品视频免费网 | 成人在线免费小视频 | 性xxxx视频播放免费 | 久久精品视频一区二区三区 | 丰满少妇一级片 | 国产黄色一区 | 亚洲九九色| 99干99| 成人在线综合 | av大片在线无码免费 | 国产美女明星三级做爰 | 中文字幕网址在线 | 成人精品在线观看 | 国产精品爽爽久久久久久 | 国产成人精品手机在线观看 | 国产黑丝高跟 | 真人二十三式性视频(动) | 永久免费精品影视网站 | 国产精品伦理久久久久 | 波多野结衣中文一区 | 黄色三级毛片视频 | 欧美乱轮 | 国产福利91精品一区二区三区 | 巨胸爆乳美女露双奶头挤奶 | 国产黄片毛片 | 日韩精品一区在线 | 欧美第一页在线观看 | 优优色综合 | 插一插射一射视频 | 男人天堂网在线观看 |