android 6.0 不能搜索Ble設備

原文:http://m.blog.csdn.net/article/details?id=50014821
今天寫好了項目準備交給測試人員去測試,但是問題來了,我平時運行的都是自己的手機,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 startLeScan(BluetoothAdapter.LeScanCallback callback)
Starts a scan for Bluetooth LE devices.
boolean startLeScan(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,</span>
             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)){
showListView();
}else {
liteble.enableLocation(this,PERMISSION_REQUEST_COARSE_LOCATION);
Toast.makeText(this,R.string.openGps,Toast.LENGTH_LONG).show();
}
return;
}
showListView();
showListView()其實就是搜索藍牙,在點擊按鈕的時候,先判斷android版本,如果是6.0就判斷GPS有沒有打開,打開了直接去搜索,沒有打開就跳轉到打開GPS界面,不是6.0版本就直接搜索了,是不是發現很簡單?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章