2016-07-04 15 views
6

CẬP NHẬTAndroid 6.0 - Bluetooth - Không có mã tồn tại cho Action_Found phát sóng ý định

tôi đã cố gắng rất nhiều mã, cũng từ các ví dụ hiển thị trên internet. mỗi người trong số họ theo cách tiếp cận của tôi. Sau nhiều giờ thử nghiệm, tôi đã đi đến kết luận rằng trên Android 6.0 không có cơ hội để đạt được phát hiện bluetooth của các thiết bị không xác định, chúng tôi chỉ có thể truy xuất các ngoại quan. Tôi chắc chắn có gì đó với phiên bản Android này.

nếu ai đó biết cách sửa lỗi này, tôi thực sự sẽ đánh giá cao bất kỳ trợ giúp nào.


Original Post

Mã của tôi đang làm việc tốt, nhưng không có các thiết bị được tìm thấy. tôi chỉ nhận được DISCOVERY_STARTED và DISCOVERY_FINISHED, vì vậy không tìm thấy thiết bị nào, nhưng sử dụng ứng dụng hệ thống các thiết bị này được tìm thấy.

Đây là mã của đơn đăng ký của tôi, hy vọng nó có thể hữu ích.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bluetoothAdapter= BluetoothAdapter.getDefaultAdapter(); 

//other stuff... 

    IntentFilter filter=new IntentFilter(); 
    filter.addAction(BluetoothDevice.ACTION_FOUND); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 

    registerReceiver(myreceiver,filter); 
} 

final BroadcastReceiver myreceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 

     Log.i("test","RECEIVED: "+ action); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
     } 
     else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
     } 

     if(BluetoothDevice.ACTION_FOUND.equals(action)) 
     { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Log.i("test", device.getName() + "\n" + device.getAddress()); 
     } 
    }}; 

public void scanDevices(View v){ 

     if (bluetoothAdapter.isEnabled()){ 

      bluetoothAdapter.startDiscovery(); 
     } 
} 

Tôi đã đã thiết lập cấp phép:

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

Có thể trùng lặp câu hỏi này [tại đây] (http://stackoverflow.com/questions/32656510/register-broadcast-receiver-dynamically-does-not-work-bluetoothdevice-action-f) –

+0

@EdwardAlexander i don ' Tôi nghĩ vậy, tôi đọc câu hỏi đó và phương pháp onReceive của tôi được gọi chính xác. vấn đề là tôi không nhận được ý định ACTION_FOUND, chỉ DISCOVERY_STARTED và DISCOVERY_FINISHED. Không tìm thấy thiết bị nào, nhưng sử dụng ứng dụng hệ thống tôi có thể truy xuất danh sách các thiết bị khả dụng. Tại sao? –

+1

Bạn nên chỉ định rõ ràng rằng bạn đang sử dụng Marshmallow, đó là một câu chuyện hoàn toàn khác, tại đây hãy kiểm tra điều này: [Bluetooth Discovery Marshmallow] (http://stackoverflow.com/questions/33052811/since-marshmallow-update-bluetooth-discovery -using-bluetoothadapter-getdefaultad) –

Trả lời

10

giải pháp Rất đơn giản:

1. Add phép FINE_LOCATION để bày tỏ:

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

2. Yêu cầu FINE_LOCATION sự cho phép tại r untime:

//since i was working with appcompat, i used ActivityCompat method, but this method can be called easily from Activity subclassess. 
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSION_REQUEST_CONSTANT); 

3. Thực hiện onRequestPermissionsResult phương pháp:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 

switch (requestCode) { 
    case MY_PERMISSION_REQUEST_CONSTANT: { 
     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      //permission granted! 
     } 
     return; 
    } 
} 
} 

Tất cả điều này vì Marshmallows đòi hỏi sự cho phép này để sử dụng bluetooth để khám phá.

Vì quyền này thuộc về nhóm quyền hạn Nguy hiểm, đơn giản tuyên bố nó trong tệp kê khai không hoạt động, chúng tôi cần sự đồng ý rõ ràng của người dùng để sử dụng vị trí đó (ngay cả khi chúng tôi không cần vị trí đó) .

+0

Rất hữu ích, cảm ơn! – Alison

Các vấn đề liên quan