13

は検出されません。 昨日、Nexus 5をAndroid 6.0にアップデートしました。その瞬間から私のアプリはもう動作しません。 私は最初に必要な設定をACCESS_COARSE_LOCATIONとしてここに追加します。https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id。 次に、ここに説明されている許可を追加しました:https://developer.android.com/training/permissions/requesting.html。 しかし最後には動作していないように見えますが、それは邪悪なデバイスを返送しません。のAndroid 6.0とBluetoothLeScanner.startScanは、私は非推奨1 <em>BluetoothAdapter.startLeScan</em>するのではなく、機能<em>BluatoothLeScanner.startScan</em>を使用しようとしているデバイス

これは私のコードです:

マニフェスト

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.stm.sensitronapp"> 
      <uses-sdk android:maxSdkVersion="23"/> 
      <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> 

      <uses-permission android:name="android.permission.BLUETOOTH"/> 
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>` 

DeviceScanActivity

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
... 

if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED){ 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION)) { 
     } else { 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_ACCESS_COARSE); 
     } 
    } 

// Device scan callback. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      mScanCallback = new ScanCallback() { 
       @Override 
       public void onScanResult(int callbackType, ScanResult result) { 
        super.onScanResult(callbackType, result); 
        mLeDeviceListAdapter.addDevice(result.getDevice()); 
        mLeDeviceListAdapter.notifyDataSetChanged(); 
       } 
      }; 
     } 
    } 
} 
final BluetoothManager bluetoothManager = 
      (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
mBluetoothAdapter = bluetoothManager.getAdapter(); 

if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) { 
     mSwipeRefreshLayout.setRefreshing(true); 
     mLeDeviceListAdapter.clear(); 
     mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); 
     if(ContextCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
       mBluetoothLeScanner.startScan(mScanCallback); 
      } 
     } 

編集:私はGPSをオンにこの問題を解決します。 this wayでプログラムで簡単に実行できます。

+0

私は同じ問題があります。回避策を見つけましたか?私は新しいスキャンAPIを試してみたいと思っていますが、両者の互換性を保つのは痛みです。 –

+4

はい、ここには、ソリューションがあります:[Android 6.0のBluetooth Low Energy startScanはデバイスを検出しません](http://stackoverflow.com/questions/33043582/bluetooth-low-energy-startscan-on-android-6 -0-does-not-find-devices)ただし、解決策は、マニフェストに権限を追加し、ScanDeviceを使用してアクティビティの実行時に権限を追加し、GPSをオンにします。信じられないですが、私の問題はGPSオフだった –

+1

GPSをオンにしてテストしたところ、それは機能しました(私はそれを持っていたタブレット上にありました)。 BLEデバイスの場合、デバイスにGPSチップがない場合はどうなりますか?バグはすぐに提出される必要があります。私は、大衆のためのBLEデバイスを作っているfitbitの人たちや他の人たちは、すでにこれらの質問をGoogleに打っていたと思います。 –

答えて

14

権限が与えられている場合は、試してみてください:GPSをオンにしてください。

+0

しかし、なぜそうですか?私はBluetoothにのみアクセスしていますか? P.S:あなたのソリューションは動作しますが –

+1

Android 6.0の変更点:このリリースから、AndroidはWi-FiおよびBluetooth APIを使用するアプリケーションのデバイスのローカルハードウェア識別子へのプログラムによるアクセスを削除します。 – qinmiao

+0

あなたは私の一日を作った! – hoangtu23

5

起動時にロケーションのアクセス権をアプリに要求していますか?そうでない場合は、他の場所のコードを処理してプロンプトを表示させます。

オープン設定>アプリケーション> YourApplication>権限 と場所を有効にして、結果をスキャンしてみてください:

また、あなたは、あなたのアプリが正常に動作しているかどうかをテストするために、これを確認することができます。

ロケーションは、マニフェストにACCESS_COARSE_LOCATIONを指定した場合にのみ、権限の下に表示されます。

+1

ロケーション権限を追加しましたが、機能していません。スキャンを開始しますが、コールバックの何も応答しません。 –

+0

「fine」と「coarse」権限を追加しましたが、まだ運がありません。検出コールバックは起動されません。 Marshmallow on Nexus 9。アプリのアンドロイド設定でロケーションが許可されていることを確認しました。デバイスが見つかりましたが、コールバックが起動していないことがわかります。また、私はそれがLollipopで解雇されていることを確認することができます。どんな解決策ですか? – 4ntoine

+2

私はそれを確認することができます。 ManifestにACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATIONを追加し、電話機でLocationを有効にすると、BLEスキャンが機能します。 Android 6.0搭載のNexus 6でテストしたところ、動作しています。 –

0

完全な答えではありませんが、新しいランタイムロケーション権限が有効になっていれば、同じ古いメソッドBTスキャンメソッドを使用できますか?作品の上方に設けられたソリューションが、副作用を使用して

  mBluetoothAdapter.startDiscovery(); 

.......

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

       if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

       mDeviceList.add(device); 


      } 
     } 
    }; 
+1

これは従来のBluetoothスキャンです。 OPはLEスキャンについて話しています。 – Mackovich

+1

あなたが間違っていると、すみません。私は、Bluetooth Classic DiscoveryとBluetooth Low Energy Scanの間には全く関係がないことを指摘しています。これらの2つのスキャンは全く異なります。デュアルモードがあり、検出可能でない限り、最初のスキャンでBLEデバイスが返されることはありません。最後に、ロケーションのアクセス権が不要で、クラシックBluetoothディスカバリ(現在はこれを試しました)が有効になっています。 – Mackovich

+0

しかし、標準設定オプションのデバイスの「古典的な」検索でも、BTLEデバイスをスキャンします。それで、クラシックデバイスとBTLEデバイスの両方を検出します。欠点は、次のステップはデバイスとペアリングすることだけです。したがって、このアプローチを使用してペアになっていないBTLEデバイスに接続することはできません。 –

2

あなたは、位置情報サービスがそれを必要としない何かのためにオンになっている必要があるということです。醜いと満足のいかない仕事は周り

アンドロイドにあなたのマニフェストのターゲットバージョンを指定することです:targetSdkVersion =「21」

これは、インストールされたバージョンが6.0.1であっても、私のネクサス7の上にスキャンすることができます。私は副作用がインストールされているバージョンよりも低いバージョンを対象としているが、少なくともスキャンは機能しているのか分かりません。 GPSレスデバイス(そのようなデバイスが存在する場合)の唯一のソリューションかもしれません。

Googleはこのために十字架に付ける必要があります。

0

これは古い質問ですが、私は誰かを助けるために回答します。
残念ながら、ACCESS_COARSE_LOCATIONとtargetSdkVersion 22の組み合わせは、一部のデバイスでは機能しません。
これは良い方法ではありませんが、私は、実行時のアクセス権(ACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATION)を使用せずに、次の方法でそれを解決した

  1. (私は多分api19〜api22が可能になると思う)19にあなたの「targetSdkVersion」を設定します
  2. は、マニフェストファイルに次の権限を追加し

    <uses-permission android:name="android.permission.READ_OWNER_DATA" /> 
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" /> 
    

は〜7.1.1

のAndroid 4.4へのテスト
-2

「minSdkVersion」を18に設定する targetSdkVersion 22

+0

これは正解です – Rest

関連する問題

 関連する問題