2016-03-24 24 views
3

6 Ben bu programıACCESS_COARSE_LOCATION

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); 
     } 
    } 
} 

yazmak için resmi örneği takip Android'de çalışmıyor Ve bu 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" /> 

yılında izindir Ama yine de bu istisna

var
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'da nasıl çalışır? Cihazımın Android sürümü 6.0.1'dir.

Bu izni neden ekledim, hala bu özel durum var mı?

+0

Eğer çalışma sırasında izin verdi mi? Eğer daha sonra ACCESS_FINE_LOCATION. Neden bilmiyorum ama ACCESS_COARSE_LOCATION çalışmıyor – Gautam

cevap

4

Andorid M, çalışma zamanında izin istekleri sunar. Uygulamanız yüklendiğinde, henüz Bluetooth kullanma izninin olmadığı anlamına gelir. Kullanıcı bu izni manuel olarak vermek zorundadır (her yükleme için bir kez).

Sadece resmi kılavuzu izleyin ->Requesting Permissions at Run Time

+0

Neden İspanyolca çevirisine bağlandınız? –

+1

Çünkü Google bazen dilimi İspanyolca'ya çeviriyor, neden olmasın;) Sabit! – rafakob