android - ACCESS_COARSE_LOCATION 不适用于 Android 6

标签 android android-bluetooth bluetooth-lowenergy

<分区>

我按照官方的例子写了这个程序

public class BluetoothActivity extends AppCompatActivity {
    private static final long SCANNING_TIMEOUT = 5000; /* 5 seconds */
    private static final int ENABLE_BT_REQUEST_ID = 1;
    private BleWrapper mBleWrapper = null;
    private boolean mScanning = false;
    private Handler mHandler = new Handler();
    private BluetoothAdapter mBluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bluetooth);
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "no ble", Toast.LENGTH_SHORT).show();
            finish();
        }
        final BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, 1);
        }
        scanLeDevice(true);


    }
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(final BluetoothDevice device, int rssi,
                                     byte[] scanRecord) {
                    Log.v("ble",device.getName());
                }
            };
    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 3000;
    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);
                }
            }, SCAN_PERIOD);

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

这是 manifests.xml 中的权限

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

但是我还是遇到了这个异常

03-24 15:52:01.126 2223-2236/com.test W/Binder: Caught a RuntimeException from the binder stub implementation.
03-24 15:52:01.126 2223-2236/com.test W/Binder: java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results

如何让BLE在Android 6上工作,我的设备Android版本是6.0.1

为什么我添加了该权限,仍然出现异常?

最佳答案

Andorid M 具有在运行时请求权限的功能。这意味着当您的应用程序安装时,它还没有使用蓝牙的权限。用户必须手动授予该权限(每次安装一次)。

按照官方指南-> Requesting Permissions at Run Time

关于android - ACCESS_COARSE_LOCATION 不适用于 Android 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195576/

相关文章:

android - Android Studio 中编译 fileTree 和 Complile jar 有什么区别?

android - 将 Android 设备用作另一台设备的耳机

ubuntu - 无法从ubuntu机器刷入cc2650

android - ActivityResultContracts 使用户在画廊或相机之间选择上传图片的方式

java - Android:表行图像变胖并且不保持纵横比

android - 循环启动和停止时蓝牙 LE 广告失败

ios - 如何使用核心蓝牙框架在最小化模式下扫描 'Lower Energy Bluetooth Device'?

ios - CoreBluetooth 框架是否支持 Request Blob Read?

Java Android SQLite 重复值

java - 在java中不连续写入文件的最佳方法是什么?