1. 程式人生 > >android 藍芽搜尋不到Ble裝置

android 藍芽搜尋不到Ble裝置

      今天寫好了專案準備交給測試人員去測試,但是問題來了,我平時執行的都是自己的手機,sdk版本是5.0(21)的,但是測試組給我的手機是安卓4.4的,結果搜都搜不到Ble裝置,苦逼了好久,我拿了一個demo對比,發現demo可以搜尋的到,然後我就對著程式碼看,看完了也沒發現個所以然,最後我決定自己寫個demo,很簡單,只要實現搜尋功能就可以了,結果並沒什麼卵用,依然搜不到,我是知道adapter只提供了兩個搜尋方法的,但是鑑於在每個公司的產品都不同,最好設定uuid去搜索。於是換了個方法,然後我去掉了uuid,結果Log就打印出來了,好吧,這都不是問題,反正在android 5.0版本是可以秒殺掃出的,於是做個版本判斷吧。希望能幫到此時還在煩惱的你。

    --------------------------分割線--------------------------

    繞回來了,今天在android6.0裝置上搜索藍芽,結果又是搜尋不到,百度搜了一下,重要在stackoverflow上找到了答案。   

   雖然android快要釋出7.0了,可是我們好像還沒用上6.0,可是如果釋出了7.0,我們離用上6.0還會久嗎?

   先說一下,雖然下面這個方法已經在5.0給拋棄了,但是還是可以用,因為android在5.0以後可以讓手機作為BLE裝置端,

   估計整合了一下方法吧,所以下面的方法被廢棄了。

boolean(UUID[] serviceUuids, 
BluetoothAdapter.LeScanCallback
 callback)Starts a scan for Bluetooth LE devices, looking for devices that advertise given services.
  我試過新方法也是可以搜尋的,就是引數設定比較麻煩,有興趣的朋友自己去試試。下面說下我是怎麼解決在6.0上搜索藍芽

  因為在android6.0對安全許可權做了很大的改變,同時搜尋藍芽是需要在AndroidManifest.xml上新增

  uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION

  如果在studio上設定目標版本是6.0的話,則需要請求上面這個許可權,程式碼如下

 // 判斷藍芽是否開啟    
 if(mBluetoothAdapter.isEnabled()){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("This app needs location access");
                    builder.setMessage("Please grant location access so this app can detect Bluetooth.");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
                            }
                        }
                    });
                    builder.show();
                }
            }
        }

  /***
     *對授權做處理,0代表授權,-1拒絕授權
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_COARSE_LOCATION: {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                   // Log.d(TAG, "coarse location permission granted");
                    finish();
                } else {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Functionality limited");
                    builder.setMessage("Since location access has not been granted, this app will not be able to discover beacons when in the background.");
                  builder.setPositiveButton(android.R.string.ok, null);
                  builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                        }
                    });
                    builder.show();
                }
                return;
            }
        }
    }

以上工作只是開啟許可權而已,或許你會發現設定了上面程式碼要求了位置許可權是可以搜尋藍芽,為什麼呢,因為會在Location開啟GPS,這時候試試關閉GPS,而這個許可權請求是完成的,你會發現根本搜尋不到藍芽,為什麼呢?能所有藍芽的關鍵原因是打開了GPS,soga,那知道問題就好辦了,我們只要開啟GPS就行了,下面是判斷GPS是否開啟的程式碼:

 // Gps是否可用
    public static final boolean isGpsEnable(final Context context) {
        LocationManager locationManager
                = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (gps || network) {
            return true;
        }
        return false;
    }

以上可以用於在點選搜尋對GPS判斷,開啟的話直接搜尋,沒有開啟的話就........那就開啟唄。

我們可以通過startactivityforresult(activity,requestcode)這個方法來跳轉到setting的Location介面,

        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        activity.startActivityForResult(intent,requestCode);
開啟GPS,然後返回就可以收到Ble裝置了!

其實我並沒有用上面那麼的許可權程式碼,只要設定目標版本是6.0,設為5.0,同時開啟GPS,同樣可以實現Ble裝置在6.0上的搜尋功能!

至此,已經解決了搜尋藍芽這個問題

下面貼一下我寫的程式碼

               if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if(isGpsEnable(this)){
                       // gps 已開,接下來請求定位許可權,已授權則開始搜尋,未授權則提示許可權通知
                       requestLocationPermission()
                    }else {
                         // 通過Intent 進入GPS設定介面,這裡建議用startActivityForResult()進入GPS設定介面,
                         // 並在onActivityResult()方法做處理,判斷gps是否開啟,未開啟給出提醒,打開了進入定位許可權流程
                        liteble.enableLocation(this,PERMISSION_REQUEST_COARSE_LOCATION);
                        Toast.makeText(this,R.string.openGps,Toast.LENGTH_LONG).show();
                    }
                    return;
                }
                showListView();

在點選按鈕的時候,先判斷android版本,如果是6.0就判斷GPS有沒有開啟,打開了再判斷許可權是否已申請,申請了直接去搜索,沒有開啟就跳轉到開啟GPS介面,6.0版本一下就直接搜尋了,是不是發現很簡單?

------------------------------------------------------------------------------

更新於 2017/1/22

關於許可權問題,不推薦大家使用我上面的方法,在這給大家推薦一個許可權的庫,

谷歌自己出品的 EasyPermission ,具體用法大家可以去github一下。

然後建議會RxJava的可以試一下 Rxpermission, 不過我是沒有嘗試,沒有太多時間,很多人都再使用。

新出的手機基本都是6.0,有的還是7.0了,國內6.0慢慢的會全部普及,所以大家寫程式的時候要適配好許可權,基本許可權庫也是必備了。

------------------------------------------------------------------------------

更新於 2018/4/27

許可權庫還是建議使用RxPermission,相比EasyPermission 還是具有很大的優勢的,不用寫那麼多介面註解,而且許可權請求操作本就是觀察者行為,天然符合Rx這種非同步庫,反正我推薦使用。

然後分享一下關於搜尋很慢的問題
親測手機藍芽模組比較差的是ovb系列,不是我黑它,除了藍芽模組還有WiFi模組也做的很爛,相比其它品牌手機,簡直不止差一個檔次,比較快的是華為,三星,小米魅族也還不錯,所以對於有搜尋時間限制的應用來說,需要給這三個品牌的手機開個後門,留有足夠的時間

相關推薦

android 搜尋Ble裝置

      今天寫好了專案準備交給測試人員去測試,但是問題來了,我平時執行的都是自己的手機,sdk版本是5.0(21)的,但是測試組給我的手機是安卓4.4的,結果搜都搜不到Ble裝置,苦逼了好久,我拿了一個demo對比,發現demo可以搜尋的到,然後我就對著程式碼看,看完了也

Android6.0 搜尋裝置原因,MIUI許可權申請機制

為提供更高的資料保護 Android6.0版本上增加了關於Wifi和藍芽的許可權。 藍芽搜尋到裝置需要用到定位服務,所以在開發中 targetSdkVersion 大於等於23(6.0) 需要在程式碼中進行許可權獲取 需要在配置檔案中申請兩個許可權: <uses

Android搜尋裝置,向其傳送資料並接收

通過藍芽傳輸資料與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的資料讀寫。而藍芽通訊也由客戶端和服務端Socket來完成。藍芽客戶端Socket是BluetoothSocket,藍芽服務端Socket是BluetoothServerSocket。這兩個類都在包

android 6.0版本以上搜尋

在activity中加如下程式碼: private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1; @Overr

Android搜尋連線通訊

  藍芽( Bluetooth® ):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽技術最初由電信巨頭愛立信公司於1994年創制,當時是作為RS232資料線的替代方案。

android研發之從裝置

android 藍芽研發之從裝置 1,定義許可權 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name

Android 4.0(ble)開發的解決方案

   最近,隨著智慧穿戴式裝置、智慧醫療以及智慧家居的普及,藍芽開發在移動開中顯得非常的重要。由於公司需要,研究了一下,藍芽4.0在Android中的應用。以下是我的一些總結。           1.先介紹一下關於藍芽4.0中的一些名詞吧:               

android 搜尋功能實現

MainActivity.java package com.example.bluefind; import android.media.AudioManager; import android.os.Bundle; import android.app.Activit

android 4.0 ble 低功耗

一:概述 這段時間做了藍芽4.0的專案,就是一個藍芽裝置控制手機進行拍照。並且有很多按鍵,不同的按鍵對應到手機上有不同的功能,並且組合起來也有不同的功能。 低功耗藍芽有中央裝置後周邊裝置的概念手機就是一箇中央裝置,像我這次試用的一個控制器, 我試過小

android搜尋重複新增解決方案

Android藍芽Chat例項執行在全信手機出現未匹配手機重複新增至列表的現象(小米手機正常),原先程式碼如下: // The BroadcastReceiver that listens for discovered devices and // chan

Android 通訊開發(一) 搜尋裝置

藍芽通訊是我們日常生活中比較方便的一種通訊技術,Android從2.0版本的SDK就開始支援藍芽。對開發人員來說,應用程式中藍芽還是一種用來建立點對點連線通訊的簡單而高效的方式。 藍芽通訊功能的實現的基本流程大致分為藍芽裝置搜尋、藍芽裝置連線和藍芽通訊

Android開發教程(一)——搜尋裝置

Android藍芽功能的開發一直是很多新手頭疼的問題,網上雖然也有很多教程貼,但大多都寫得不全面,不能讓我們真正掌握藍芽開發的基本知識。本教程主要講解搜尋藍芽裝置、藍芽裝置之間的連線和藍芽之間的通訊三個主要模組。掌握了這三個,基本就能進行簡單的藍芽開發了。

Android開發(一)之開啟裝置搜尋

Android藍芽開發系列目錄: 一、判斷是否系統是否支援藍芽 在使用藍芽之前,我們首先要判斷手機裝置是否支援藍芽,雖然現在基本都支援藍芽了,但是為了程式碼的嚴謹性我們還是需要在程式碼中判斷: private BluetoothManager bluetoothma

Android BLE 中onCharacteristicChanged走回調的解決方案

做個小筆記,具體有關Android 藍芽Ble的問題請看下面兩篇文章,寫的很實用 最近在做一個智慧硬體的專案,遇到一個問題浪費了我三天時間,所以決定把它記錄下來。我訪問各大論壇沒有一個明確的

(一)Android的第一步操作—— —— 掃描本機是否存在裝置

 1.進行操作前要把藍芽許可權開啟       在AndroidManifest中新增許可權命令 <uses-permission android:name="android.permission.BLUETOOTH" /> 2.繼承OnClickLis

Android BLE開發詳解

轉載請註明出處。    https://blog.csdn.net/kong_gu_you_lan/article/details/81009800 1.介紹 藍芽是一種短距離的無線通訊技術,可以實現固定裝置、移動裝置之間的資料交換。一般將藍芽分為兩大類,藍芽3.0規範之前的

AndroidBLE

Android的BLE就是低功耗藍芽,是在Android4.3之後才支援的功能。 在這個BLE的層級關係中一個低功耗藍芽可以有多個Service,而一個Service可以有多個Characteristic。 Service可以看做一個功能的集合,sevice有自己的獨立唯一的16位的UUID

Android移動開發-(BlueTooth)裝置檢測連線的實現

無論是WIFI還是4G網路,建立網路連線後都是訪問網際網路資源,並不能直接訪問區域網資源。比如兩個人在一起,A要把手機上的視訊傳給B,通常情況是開啟手機QQ,通過QQ傳送檔案給對方。不過上傳視訊很耗流量,如果現場沒有可用的WIFI,手機的資料流量又不足,那

Android 開發 —— BLE

藍芽——BLE 介紹 1.BLE 是 Bluetooth Low Energy 的縮寫,意思為低功耗藍芽。由藍芽技術聯盟(Bluetooth SIG)設計的無線通訊技術,主要用於醫療,健身,安全和家庭娛樂行業。 與傳統藍芽相比,藍芽低功耗旨在大幅降低功耗

Android 開發之搜尋、配對、連線、通訊大全

        藍芽( Bluetooth®):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽裝置最多可以同時和7個其它藍芽裝置建立連線,進行通訊,當然並不是每一個藍芽都可以達到