2016-03-22 21 views
7

6.01'deki Bluetooth, güncelleme + appCompat for Kitkat 4.4.4 için aşağıdaki kod ve izinlerle beklendiği gibi çalışmıyor gibi görünüyor.Android Marshmallow 6.0.1 Bluetooth Tarama Dönme Sonuç Yok

Sonuç yok ve çevrede çok sayıda bulunabilir cihaz var.

Neden olduğu hakkında herhangi bir fikir sahibi misiniz? Ben 5.

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

package bluetoothscanneractivity; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 

public class BluetoothScannerActivity extends Activity { 
    //private final BroadcastReceiver FoundReceiver = null; 
    protected ArrayList<BluetoothDevice> foundDevices = new ArrayList<BluetoothDevice>(); 
    private ListView foundDevicesListView; 
    private ArrayAdapter<BluetoothDevice> btArrayAdapter; 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_bluetooth_scanner); 
     final BluetoothAdapter myBlueToothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     final Button scanb = (Button) findViewById(R.id.button); 
     final ListView foundDevicesListView = (ListView) findViewById(R.id.listView1); 

     btArrayAdapter = new ArrayAdapter<BluetoothDevice>(this, 
       android.R.layout.simple_list_item_1, foundDevices); 
     foundDevicesListView.setAdapter(btArrayAdapter); 

     //Turn on Bluetooth 
     if (myBlueToothAdapter == null) 
      Toast.makeText(BluetoothScannerActivity.this, "Your device doesnot support Bluetooth", Toast.LENGTH_LONG).show(); 
     else if (!myBlueToothAdapter.isEnabled()) { 
      Intent BtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(BtIntent, 0); 
      Toast.makeText(BluetoothScannerActivity.this, "Turning on Bluetooth", Toast.LENGTH_LONG).show(); 
     } 
     //scan 
     scanb.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       btArrayAdapter.clear(); 
       myBlueToothAdapter.startDiscovery(); 
       Toast.makeText(BluetoothScannerActivity.this, "Scanning Devices", Toast.LENGTH_LONG).show(); 

      } 
     }); 

     registerReceiver(FoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
     IntentFilter filter = new IntentFilter(
       BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     this.registerReceiver(FoundReceiver, filter); 

    } 

    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     unregisterReceiver(FoundReceiver); 
    } 

    private final BroadcastReceiver FoundReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String action = intent.getAction(); 

      // When discovery finds a new device 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       if (!foundDevices.contains(device)) { 
        foundDevices.add(device); 
        btArrayAdapter.notifyDataSetChanged(); 
       } 
      } 

      // When discovery cycle finished 
      if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       if (foundDevices == null || foundDevices.isEmpty()) { 
        Toast.makeText(BluetoothScannerActivity.this, "No Devices", Toast.LENGTH_LONG).show(); 
       } 
      } 

     } 
    }; 


} 
+0

Lütfen startDiscovery() yöntem kodunu yapıştırabilir misiniz? –

+0

Gerek yok - bu standart Android BL çağrısı. – mcdoomington

+0

Tost - Toast.makeText (BluetoothScannerActivity.this, "Tarama Aygıtları", Toast.LENGTH_LONG) .show(); –

cevap

4

, - bu şu çalışır:

package bluetoothscanneractivity; 

import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.Manifest; 

import java.util.ArrayList; 

public class BluetoothScannerActivity extends AppCompatActivity { 
    //private final BroadcastReceiver FoundReceiver = null; 
    protected ArrayList<BluetoothDevice> foundDevices = new ArrayList<BluetoothDevice>(); 
    private ListView foundDevicesListView; 
    private ArrayAdapter<BluetoothDevice> btArrayAdapter; 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_bluetooth_scanner); 
     final BluetoothAdapter myBlueToothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     final Button scanb = (Button) findViewById(R.id.button); 
     final ListView foundDevicesListView = (ListView) findViewById(R.id.listView1); 

     btArrayAdapter = new ArrayAdapter<BluetoothDevice>(this, 
       android.R.layout.simple_list_item_1, foundDevices); 

     foundDevicesListView.setAdapter(btArrayAdapter); 

     //Turn on Bluetooth 
     if (myBlueToothAdapter == null) 
      Toast.makeText(BluetoothScannerActivity.this, "Your device doesnt support Bluetooth", Toast.LENGTH_LONG).show(); 
     else if (!myBlueToothAdapter.isEnabled()) { 
      Intent BtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(BtIntent, 0); 
      Toast.makeText(BluetoothScannerActivity.this, "Turning on Bluetooth", Toast.LENGTH_LONG).show(); 
     } 

     // Quick permission check 
     int permissionCheck = this.checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION"); 
     permissionCheck += this.checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION"); 
     if (permissionCheck != 0) { 

      this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number 
     } 


     scanb.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       btArrayAdapter.clear(); 

       myBlueToothAdapter.startDiscovery(); 

       Toast.makeText(BluetoothScannerActivity.this, "Scanning Devices", Toast.LENGTH_LONG).show(); 

      } 
     }); 

     registerReceiver(FoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
     IntentFilter filter = new IntentFilter(
       BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     this.registerReceiver(FoundReceiver, filter); 

    } 

    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     unregisterReceiver(FoundReceiver); 
    } 


    private final BroadcastReceiver FoundReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String action = intent.getAction(); 

      // When discovery finds a new device 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       if (!foundDevices.contains(device)) { 
        foundDevices.add(device); 
        Toast.makeText(BluetoothScannerActivity.this, "name: " + device.getName() + " " + device.getAddress(), Toast.LENGTH_LONG).show(); 
        btArrayAdapter.notifyDataSetChanged(); 
       } 

      } 

      // When discovery cycle finished 
      if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       if (foundDevices == null || foundDevices.isEmpty()) { 
        Toast.makeText(BluetoothScannerActivity.this, "No Devices", Toast.LENGTH_LONG).show(); 
       } 
      } 

     } 
    }; 


} 
+0

'un ilk parametresi olarak aktivite adını aldım, uygulama geliştiricisi değilim, ancak telefonumun Android 6.0.1 sürümüne geçtiğinden beri "blueterm" uygulamasının artık gömülü cihazıma bağlanmadığını fark ettim. Böyle bir uygulamaya uygulanacak bir sorun mu var? –

+0

Şüpheleniyorum - bu, hızlı ve kirli bir çalışma olduğu için izin işleme şeklini değiştirebilirsiniz. – mcdoomington

+0

Teşekkürler, sanırım "blueterm" app kaynak koduna erişim hakkım var, değil mi? –

13

Sen Marshmallow beri, kendi görev için bu izinleri ihtiyaç olduğunu biliyoruz Nexus üzerinde çalıştırıyorum - Marshmallow beri Ayrıca

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

, sen bile olsa izinleri için programlı istemek zorunda Onları Manifest dosyasında ilan ettim.

Yani startDiscovery()

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number 

önce yer izinleri için istemek zorunda Ve kullanıcı bu izinleri kabul ettikten sonra startDiscovery() yapabilirsiniz. Ve eğer inkar ederse, cihazları bulamazsın. Kullanıcı eylemini

onRequestPermissionsResult() geri bildirimde kontrol edebilirsiniz. 23 SDK sürümü min değişen eklenen izinleri ile

+0

Ahh Bilmiyordum programatik olarak izin istiyordum - bunu kontrol edeceğim. – mcdoomington

+0

Ahh Programlama gereği izin istediğimi bilmiyordum, ancak hala çalışmıyor. İzin, uygulamanın Bilgi izni sayfası aracılığıyla bile etkinleştirildi. – mcdoomington

+0

Bunun benim için sorunu çözdüğünü onaylayabilirim, ana faaliyetimde yapıyorum. – Dayan

2

SDK sürümü ise aşağıda yöntem yalnızca> Lollipop çalıştırır. Bu kısıtlama olmadan kullanmaya çalıştığımda uygulamanız çöktü. Sadece kullanmadan hemen önce bu yöntemi çağırın .startDiscovery();

public void checkBTPermissions(){ 
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){ 
      int permissionCheck = this.checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION"); 
     permissionCheck += this.checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION"); 
     if (permissionCheck != 0) { 

      this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number 
     } 
    }else{ 
     Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version < LOLLIPOP."); 
    } 
} 
İlgili konular