Bana yakındaki BLE cihazlarını taramak ve cihaz adı ve MAC ID ile listelemek için basit bir kod sağlayabilirsin. Bunu, http://developer.android.com/guide/topics/connectivity/bluetooth-le.html'da sağlanan örnek kodu kullanarak denedim. Ancak BLE uygulamasında yeni olduğumdan beri herhangi bir referans bağlantısı veya fikir çalışmadı.Android listeleme Cihaz taramasından sonra BLE cihazları
cevap
Bu örnek, gönderdiğiniz ve geliştirdiğim geliştirici web sitesine dayanmaktadır.
DeviceScanActivity.class
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;
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();
}
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;
}
} Listview için
özel düzen listitem_device.xml
: tarama actionbar_indeterminate_progress.xml
üzerinde
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/device_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"/>
<TextView android:id="@+id/device_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12dp"/>
</LinearLayout>
ilerleme çubuğu Bu kodudur:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="56dp"
android:minWidth="56dp">
<ProgressBar android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"/>
</FrameLayout>
main.xml
menü düzeni:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_refresh"
android:checkable="false"
android:orderInCategory="1"
android:showAsAction="ifRoom"/>
<item android:id="@+id/menu_scan"
android:title="@string/menu_scan"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_stop"
android:title="@string/menu_stop"
android:orderInCategory="101"
android:showAsAction="ifRoom|withText"/>
</menu>
strings.xml
dizeleri düzeni:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ble_not_supported">BLE is not supported</string>
<string name="error_bluetooth_not_supported">Bluetooth not supported.</string>
<string name="unknown_device">Unknown device</string>
<!-- Menu items -->
<string name="menu_connect">Connect</string>
<string name="menu_disconnect">Disconnect</string>
<string name="menu_scan">Scan</string>
<string name="menu_stop">Stop</string>
</resources>
Ve tezahür AndroidManifest.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.bluetoothlegatt"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="18"
android:targetSdkVersion="19"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@android:style/Theme.Holo.Light">
<activity android:name=".DeviceScanActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Sanırım hepsi bu. Bir şeyi özlediysem, izin ver ve düzelteyim. Umarım yardımcı olur!!
(Bluetooth LE oldukça henüz Android'de berbat!: D ... ihtiyaçları ve hızlı güncelleme)
GÜNCELLEME: Burada
İndir BLE tarama ve bağlantının tam bir örnek: https://dl.dropboxusercontent.com/u/18548987/DeviceScanActivity.rar
bu ama sadece Bluetooth SIG tarafından sağlanan resmi kaynak kodlarını kontrol etmek önermek istiyorum gelecek okuyucular için, oldukça eski bir soru:
çoğu mobil platformlarda (Android, iOS, Windows Phone ve daha fazla) + bazı malzemeleri/öğreticiler için uygulamalar, küçük anlaşılması kolay ve belgelenmiş bulunmaktadır. Eğer BLE ile oynamaya başlamak istiyorsanız, bu benim görüşüme göre en iyi başlangıç noktasıdır.
Herşey ücretsizdir, ancak web sitesine kayıt olmanız gerekmektedir. Hatırlayabildiğim kadarıyla, belki de Bluetooth geliştirme için yeni araçlarla bağlantılı olarak yılda 1-3 e-posta var.
Darek
içinde 'onCharacteristicRead' değeri alacaksınız Android 6.0 desteği ile yeni bir sürümü var: https://www.bluetooth.com/develop-with-bluetooth/developer-resources-tools/app-acc-2 –
Teşekkür ederim, BLE Tarayıcılarının çalışmamasının birçok örneği arasında, bu (Evin1_'den son bağlantı) iyi çalışıyor. – Ujeenator
- 1. Bluetooth yeniden başlatıldıktan sonra BLE Taraması yeniden başlatılıyor (ANDROID)
- 2. RSSI'den hesaplama BLE android
- 3. Android BLE GATT_ERROR (133) aygıta bağlanmakta
- 4. Samsung cihazları
- 5. Android BLE readCharacteristic başarısız oluyor
- 6. Android: Uygulamam 0 cihazları destekler
- 7. Android BLE: Bir Karakteristik (hayır PROPERTY_WRITE)
- 8. ZXing 2.0 QR-Code Taramasından Sonra Parçanın Başlatılması
- 9. Android 4.4: Bluetooth Düşük Enerji; Bir BLE cihazı için tarama yapmadan bağlanın
- 10. Android Cihaz Monitör mac
- 11. İmleç ile Android nüfus listeleme
- 12. Android 4.x cihazları GCM mesajlarını alıyor, ancak Android 2.3 cihazları yok
- 13. Android uygulamasındaki belirli cihazları tespit edin
- 14. Paylaşım, yakınlardaki cihazları keşfeder android programatik olarak
- 15. Android Scroll Dolummuyor Cihaz Ekran
- 16. Android cihaz olmadan android uygulamaları geliştirme
- 17. Android stüdyo ve cihaz harici
- 18. Android Studio'da aynı anda çalışan birden fazla cihaz için Logcat?
- 19. text BLE verisini görüntüleGörüntüleme
- 20. BLE etkin bir Android/iPhone'u BLE işaretçisi olarak kullanmak mümkün mü?
- 21. Cihazları kullanarak kıyaslama performansı
- 22. BLE (iBeacons) Trilateration
- 23. USB cihazları doğrudan donanımlara erişebilir mi?
- 24. Android: Cihaz uygulamalarının listesini alma - Çok yavaş
- 25. Android cihaz için özel kamera yolu sorunu
- 26. C# RFID taramasından nasıl otomatik olarak tamamlanır?
- 27. Çoklu bağlantı Ble
- 28. Android: USB İletişim Android <-> Harici Cihaz
- 29. Android BLE sorunu: Arka plan bağlantısı için desteklenmeyen aktarım
- 30. Cihaz Yöneticisi API'sı, cihaz sahibi nasıl olunur?
Değerli zaman ayırdığınız için teşekkür ederiz.Ben kontrol edeceğim ve yakında bilelim :) – info
Merhaba, çökme hatası alıyorum D/AbsListView (17995): unregisterIRListener() denir. Samsung galaxy s4 çalışırken. Plz yardım – info
Gerçekten bu hatanın ne olduğunu bilmiyorum. Her neyse, aynı zamanda ble cihazlarına bağlanmak ve onların hizmet özelliklerini görmek için izin verecek tam bir proje indirmek ve deneyin: https://www.dropbox.com/s/66y8j9auptllbhf/DeviceScanActivity.rar – margabro