1

ANSWER:正しい方向に私を操り、価値のあるリソースを提供するために、以下のNelson Hoangに感謝します。場所のアクセス許可を追加するためのコードが追加されたら(下記のEdit2を参照)、私は手動で設定して、アプリケーションのロケーション権限を切り替えなければなりませんでした。これが完了したら、それはとてもうまくいっていた。Bluetooth Le Gatt Any Devicesを見つけることができません

質問:アンドロイドスタジオの標準Bluetooth LE Gattを使用してBluetooth LEデバイスに接続しようとしています。私は毎回2.8から2.10にgradleを更新しなければならない。私はこれをさまざまなプロジェクトで自動的かつ手動で行っています。

しかし、私はこのアプリケーションを自分のGalaxy S7にダウンロードした後、3つのBluetooth LEデバイスがすぐ隣にブロードキャストされているにもかかわらず、スキャンして何も見つけません。私はBluefruit LEを使用していて信号を受信して​​正常に接続できたので、S7にはハードウェアの問題ではないことが分かりました。どんな解決策ですか?

編集:示唆しているとおり、私は以下のスキャンコードを掲示します。しかし、これは私が実際に書いたものではありません。これはAndroid StudioからすべてアクセスできるBluetooth LEのサンプルコードです。

EDIT2:私はマニフェストに追加し、アプリlocatin権限を付与するために:

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

これは、通常のブルートゥースパッケージに加えていたが、それは何も変更しませんでした。

package com.example.android.bluetoothlegatt; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 

/** 
* Activity for scanning and displaying available Bluetooth LE devices. 
*/ 
public class DeviceScanActivity extends ListActivity { 
    private LeDeviceListAdapter mLeDeviceListAdapter; 
    private BluetoothAdapter mBluetoothAdapter; 
    private boolean mScanning; 
    private Handler mHandler; 

    private static final int REQUEST_ENABLE_BT = 1; 
    // Stops scanning after 10 seconds. 
    private static final long SCAN_PERIOD = 10000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().setTitle(R.string.title_devices); 
     mHandler = new Handler(); 

     // Use this check to determine whether BLE is supported on the device. Then you can 
     // selectively disable BLE-related features. 
     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
      Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 

     // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to 
     // BluetoothAdapter through BluetoothManager. 
     final BluetoothManager bluetoothManager = 
       (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 

     // Checks if Bluetooth is supported on the device. 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show(); 
      finish(); 
      return; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     if (!mScanning) { 
      menu.findItem(R.id.menu_stop).setVisible(false); 
      menu.findItem(R.id.menu_scan).setVisible(true); 
      menu.findItem(R.id.menu_refresh).setActionView(null); 
     } else { 
      menu.findItem(R.id.menu_stop).setVisible(true); 
      menu.findItem(R.id.menu_scan).setVisible(false); 
      menu.findItem(R.id.menu_refresh).setActionView(
        R.layout.actionbar_indeterminate_progress); 
     } 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_scan: 
       mLeDeviceListAdapter.clear(); 
       scanLeDevice(true); 
       break; 
      case R.id.menu_stop: 
       scanLeDevice(false); 
       break; 
     } 
     return true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled, 
     // fire an intent to display a dialog asking the user to grant permission to enable it. 
     if (!mBluetoothAdapter.isEnabled()) { 
      if (!mBluetoothAdapter.isEnabled()) { 
       Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
      } 
     } 

     // Initializes list view adapter. 
     mLeDeviceListAdapter = new LeDeviceListAdapter(); 
     setListAdapter(mLeDeviceListAdapter); 
     scanLeDevice(true); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // User chose not to enable Bluetooth. 
     if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) { 
      finish(); 
      return; 
     } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     scanLeDevice(false); 
     mLeDeviceListAdapter.clear(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position); 
     if (device == null) return; 
     final Intent intent = new Intent(this, DeviceControlActivity.class); 
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName()); 
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress()); 
     if (mScanning) { 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      mScanning = false; 
     } 
     startActivity(intent); 
    } 

    private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mScanning = false; 
        mBluetoothAdapter.stopLeScan(mLeScanCallback); 
        invalidateOptionsMenu(); 
       } 
      }, SCAN_PERIOD); 

      mScanning = true; 
      mBluetoothAdapter.startLeScan(mLeScanCallback); 
     } else { 
      mScanning = false; 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
     invalidateOptionsMenu(); 
    } 

    // Adapter for holding devices found through scanning. 
    private class LeDeviceListAdapter extends BaseAdapter { 
     private ArrayList<BluetoothDevice> mLeDevices; 
     private LayoutInflater mInflator; 

     public LeDeviceListAdapter() { 
      super(); 
      mLeDevices = new ArrayList<BluetoothDevice>(); 
      mInflator = DeviceScanActivity.this.getLayoutInflater(); 
     } 

     public void addDevice(BluetoothDevice device) { 
      if(!mLeDevices.contains(device)) { 
       mLeDevices.add(device); 
      } 
     } 

     public BluetoothDevice getDevice(int position) { 
      return mLeDevices.get(position); 
     } 

     public void clear() { 
      mLeDevices.clear(); 
     } 

     @Override 
     public int getCount() { 
      return mLeDevices.size(); 
     } 

     @Override 
     public Object getItem(int i) { 
      return mLeDevices.get(i); 
     } 

     @Override 
     public long getItemId(int i) { 
      return i; 
     } 

     @Override 
     public View getView(int i, View view, ViewGroup viewGroup) { 
      ViewHolder viewHolder; 
      // General ListView optimization code. 
      if (view == null) { 
       view = mInflator.inflate(R.layout.listitem_device, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); 
       viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); 
       view.setTag(viewHolder); 
      } else { 
       viewHolder = (ViewHolder) view.getTag(); 
      } 

      BluetoothDevice device = mLeDevices.get(i); 
      final String deviceName = device.getName(); 
      if (deviceName != null && deviceName.length() > 0) 
       viewHolder.deviceName.setText(deviceName); 
      else 
       viewHolder.deviceName.setText(R.string.unknown_device); 
      viewHolder.deviceAddress.setText(device.getAddress()); 

      return view; 
     } 
    } 

    // Device scan callback. 
    private BluetoothAdapter.LeScanCallback mLeScanCallback = 
      new BluetoothAdapter.LeScanCallback() { 

     @Override 
     public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mLeDeviceListAdapter.addDevice(device); 
        mLeDeviceListAdapter.notifyDataSetChanged(); 
       } 
      }); 
     } 
    }; 

    static class ViewHolder { 
     TextView deviceName; 
     TextView deviceAddress; 
    } 
} 
+0

ここにスキャンコードを掲載できますか? – reTs

答えて

6

位置情報を有効にしていますか? Android 6.0以降のデバイスでは、Bluetooth LE周辺機器をスキャンするためにロケーションをオンにする必要があります。 Bluetooth Low Energy startScan on Android 6.0 does not find devices

+0

私はその場所を持っていて、もう一度試しました。まだ運はありません。助けてくれてありがとう! –

+1

それは働いた!私は、アプリケーションの権限を与えるためのコードを追加し、手動で設定でアプリの場所の権限を与えなければなりませんでした。これが完了したら、ついに信号を拾い始めました!もう一度ありがとうNelson Hoang! –

関連する問題