1. 程式人生 > >Android M(6.0)掃描不到藍芽裝置的處理辦法

Android M(6.0)掃描不到藍芽裝置的處理辦法

描述:在Android6.0手機上掃描不到藍芽裝置(如Nexus6),並會丟擲一個異常:

 java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
	 at android.os.Parcel.readException(Parcel.java:1599)
	 at android.os.Parcel.readException(Parcel.java:1552)
	 at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:772)
	 at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:324)
	 at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56)
	 at android.os.Binder.execTransact(Binder.java:453)

解決辦法:
1,在清單檔案加入許可權:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

2,在Activity中呼叫 requestPermissions() 方法來請求許可權,系統會彈出需要請求許可權的對話方塊
3,重寫Activity的onRequestPermissionsResult()方法,接收許可權是否請求的請求狀態
示例程式碼如下:

private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ......
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // Android M Permission check
        if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_COARSE_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // TODO request success
            }
        break;
    }
}

注:第2、3步驟在targetSdkVersion大於等於23(6.0)時必須新增,小於23時可以不用新增。所以另外一種處理辦法是隻加許可權,然後把targetSdkVersion設定到23以下也能達到同樣的效果,不過使用者可以在許可權管理中禁止了該許可權,一樣會搜不到裝置。
另外在Android 6.0上對應用許可權進行授權是發生在應用執行時,而不是在安裝時。同時使用者也可以在應用程式設定中撤銷對應用的許可權授權。因此當要獲取敏感許可權(如相機、聯絡人)時最好先檢查使用者是否授予了改許可權,如果沒授予給出提示框提醒使用者授予。
參考文章:http://developer.radiusnetworks.com/2015/09/29/is-your-beacon-app-ready-for-android-6.html

相關推薦

Android M6.0掃描裝置處理辦法

描述:在Android6.0手機上掃描不到藍芽裝置(如Nexus6),並會丟擲一個異常: java.lang.SecurityException: Need ACCESS_COARSE_LOCA

Android M6.0掃描裝置報許可權安全異常處理辦法

/*** * * 處理許可權申請回調 */ @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

Android M6.0 靜默安裝和靜默解除安裝經驗分享

靜默安裝和解除安裝經驗: 靜默解除安裝: String appPackage ="被解除安裝應用的包名"; Intent intent = new Intent(mContext, mContext.getClass()); PendingIntent sender = P

Android完全解決6.0以上機型能拍照選擇相簿問題

   由於最近專案涉及實現上傳圖片,由手機拍照和從相簿選擇圖片,弄了好幾天,最終解決所有問題,包括Android6.0不能拍照,選擇相簿得不到路徑,今天特意記錄下~ 首先需要畫好佈局,以及工具類  效果圖   直接貼程式碼了,沒什麼技術含量,只是蒐集資料很不容易而已~

ceph pgs inconsistent pgs一致 異常狀態處理方式

問題描述:在某些情況下,osd出現異常,導致pgs出現不一致狀態# ceph health detailHEALTH_ERR 1 pgs inconsistent; 1 scrub errorspg 6

UEFIWIN8/WIN10啟動識別U盤解決辦法

同學新買的電腦,配的是win10的系統,準備換成win7的系統時,死活不認u盤 解決辦法 1. 更改BIOS配置,使用相容模式啟動 2. 更換系統映象或新增引導檔案,使U盤

Android 呼叫相機、相簿適配6.0

又好久沒有寫部落格了,好習慣不能斷,該寫點就得寫點,今天帶來的筆記是關於Android 專案呼叫系統相機 與呼叫系統相簿的之後拿到照片的基本操作,我感覺好多人還是不太熟悉的哈。專案相容 Android 5.0裝置、Android 6.0裝置、Android 7.0、Android 8.0

android 判斷攝像頭是否可用6.0以下

android 6.0以下系統判斷當前攝像頭是否可用 問題概述 android 應用程式無法判定當前是否有攝像頭的使用許可權,是否可用。 附一篇6.0許可權的文章,有概論、有圖還有程式碼。輕鬆解決應用程式判斷是否有許可權的問題。android 6.0

判斷Android手機OPPO手機是否有錄音許可權相容6.0以下

專案中遇到老的OPPO手機5.1的版本,出現明明拒絕了錄音許可權,但是回撥依然是true,自從6.0之後出了執行時許可權,獲取許可權的方式就變得統一化了,首先在清單檔案配置需要的許可權,然後使用時拍照或者錄音去呼叫 //6.0以上動態獲取許可權 if (Conte

Android許可權管理原理6.0

前言Android系統在MarshMallow之前,許可權都是在安裝的時候授予的,雖然在4.3時,Google就試圖在原始碼裡面引入AppOpsManager來達到動態控制權限的目的,但由於不太成熟,在Release版本中都是把這個功能給隱藏掉的。在6.0之後,Google為

MarshmallowAndroid 6.0 簡介

本文會介紹如何使用Xamarin.Android 去開發基於Android 6.0的App。也會大致的介紹Android 6.0的新功能,以及如何在Xamarin中配置Android 6.0的開發環境從而實現新特性的例程。 總覽 Google最近釋出了作為Android L

(解決)android不同版本的【沉浸式狀態列】4.4/5.0/5.1/6.0

介紹: 各個版本有略微的區別,下面我就根據自己的測試和除錯寫出對應的方法: 4.4以上(API>=19)的前提下,任選以下方法: 1.法1:只要呼叫一個方法,setContentView前: getWindow().addFlags(Win

android arcgis100.0.0載入MMPK和GEODATABASE資料型別的離線圖層

arcgis版本:arcgis-android:100.0.0 圖層型別:使用FeatureLayer 資料型別:MMPK,GEODATABASE //圖層載入類 LayerUtil{ private static ArrayList<FeatureLayer> mFe

android arcgis100.0.0 載入網路圖層

arcgis版本:arcgis-android:100.0.0 載入線上地圖: 1.是使用ArcGISMapImageLayer載入,以圖片形式載入整個地圖,適合大資料量載入 ArcGISMapImageLayer layer = new ArcGISMapImageLayer(

Android進階3:Activity原始碼分析2 —— Activity啟動和銷燬流程8.0

上篇文章講述了app從啟動建立Activity呼叫onCreate,onStart, onResume方法,這篇文章講述一下Activity啟動的另一個切入點:startActivity方法,啟動Activity。 通過上一篇文章,我們總結一下: 1:A

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

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

從volatile解讀ConcurrentHashMapjdk1.6.0無鎖讀

作者:綾萱 volatile常常用於修飾多執行緒共享變數,用來保證該變數的可見性。volatile的語意:某個寫執行緒對volatile變數的寫入馬上可以被後續的某個讀執行緒“看”到。 volatile保證可見性的原理:volatile是通過在編譯器生成位元組碼時,在對volatile變數進

iscroll在安卓高版本6.0以上某些機型上滑動卡頓問題的解決方法

問題:發現公司專案移動端的分類頁面在某些安卓機型上滑動時異常卡頓,而且出現卡頓的手機都是非常新的安卓手機,除錯的時候發現在谷歌瀏覽器的手機模擬滾動時也非常卡頓   在一段糾結異常的除錯和搜尋下找到了解決方法: 使用用fixed版本的iscroll就可以了:https://github.com/

用URL 下載圖片程式碼 6.0許可權

首先我們知道要用到安卓讀寫許可權 只需要在AndroidManifest檔案中宣告即可,就像下面這樣: <uses-permission android:name="android.permission.INTERNET" />

Android圖表控制元件MPAndroidChart的簡單介紹MPAndroidChart3.0

每個類對應的圖是什麼github上有詳細的介紹圖表類具有相同的地方X軸:XAxisY軸:YAxis圖例:Legend描述:Description限制線:LimitLine選中圖表中的值,可顯示的檢視:MarkerView 具體在圖表中的表現如下圖以曲線圖為例依賴:projec