Android bluetooth device mac address

Connect to a bluetooth device using stored MAC address through service

I am new to Android and I am trying to understand the working of Bluetooth connection. For that I have used used the wiced sense app to understand the working. Here I want to connect to a particular device with respect to their MAC address. I have managed to store and retrieve the MAC address through Shared preferences. And now I want to connect to device which matches the MAC address without user interaction. To store the MAC address I do the following:

 public View getView(int position, View convertView, ViewGroup parent) < ViewHolder holder; if (convertView == null || convertView.findViewById(R.id.device_name) == null) < convertView = mInflater.inflate(R.layout.devicepicker_listitem, null); holder = new ViewHolder(); String DeviceName; holder.device_name = (TextView) convertView.findViewById(R.id.device_name); // DeviceName= String.valueOf((TextView) convertView.findViewById(R.id.device_name)); holder.device_addr = (TextView) convertView.findViewById(R.id.device_addr); holder.device_rssi = (ProgressBar) convertView.findViewById(R.id.device_rssi); convertView.setTag(holder); >else < holder = (ViewHolder) convertView.getTag(); >DeviceRecord rec = mDevices.get(position); holder.device_rssi.setProgress(normaliseRssi(rec.rssi)); editor = PreferenceManager.getDefaultSharedPreferences(mContext); String deviceName = rec.device.getName(); if (deviceName != null && deviceName.length() > 0) < holder.device_name.setText(rec.device.getName()); holder.device_addr.setText(rec.device.getAddress()); //Log.i(TAG, "Service onStartCommand"); if(deviceName.equals("eVulate")&& !editor.contains("MAC_ID")) < storeMacAddr(String.valueOf(rec.device.getAddress())); >> else < holder.device_name.setText(rec.device.getAddress()); holder.device_addr.setText(mContext.getResources().getString(R.string.unknown_device)); >return convertView; public void storeMacAddr(String MacAddr) < editor.edit().putString("MAC_ID", MacAddr).commit(); >> 
private void initDevicePicker() < final SharedPreferences mSharedPreference= PreferenceManager.getDefaultSharedPreferences(getBaseContext()); if(mSharedPreference.contains("MAC_ID"))< String value=(mSharedPreference.getString("MAC_ID", "")); >else // search for devices > 

I want to start a service after retrieving the MAC address and I don’t know where exactly to do that. Any kind of help is appreciated.

I saw one of the answer which suits to my situation here . If anyone can provide me some more details especially with MyApplication and Abstract class it would be really helpful.

2 Answers 2

All you have the MAC addresses of some bluetooth devices and you want to connect to them using their MAC addresses. I think you need to read more about bluetooth discovery and connection but anyway, I’m putting some code which might help you later after reading about Android bluetooth.

From your Activity you need to register a BroadcastReceiver so identify the bluetooth connection changes and to start discovering nearby bluetooth devices. The BroadcastReceiver will look like this

private final BroadcastReceiver mReceiver = new BroadcastReceiver() < public void onReceive(Context context, Intent intent) < String action = intent.getAction(); if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) < >else if (BluetoothDevice.ACTION_FOUND.equals(action)) < BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getAddress().equals(Constants.DEVICE_MAC_ADDRESS)) < startCommunication(device); >> else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) < >else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) < // Your bluetooth device is connected to the Android bluetooth >else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) < // Your device is disconnected. Try connecting again via startDiscovery mBluetoothAdapter.startDiscovery(); >> >; 

There’s a startCommunication function inside I’ll post it later in this answer. Now you need to register this BroadcastReceiver in your activity.

Читайте также:  Bluetooth ресивер ugreen cm309

Inside your onCreate register the receiver like this

// Register bluetooth receiver IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver, filter); 

Don’t forget to unregister the receiver inside onDestroy function of your Activity

unregisterReceiver(mReceiver); 

Now in your Activity you need to declare a BluetoothAdapter to start bluetooth discovery and a BluetoothSocket to make connection with the bluetooth. So you need to add these two variables in your Activity and initialize them accordingly.

// Declaration public static BluetoothSocket mmSocket; public static BluetoothAdapter mBluetoothAdapter; 
// Inside `onCreate` initialize the bluetooth adapter and start discovering nearby BT devices mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mBluetoothAdapter.enable(); mBluetoothAdapter.startDiscovery(); 

Now here you go for the startCommunication function

void startCommunication(BluetoothDevice device) < if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) < ConnectThread mConnectThread = new ConnectThread(device); mConnectThread.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); >else < ConnectThread mConnectThread = new ConnectThread(device); mConnectThread.execute((Void) null); >> 

The ConnectThread is an AsyncTask which connects to a desired device in a different thread and opens a BluetoothSocket for communication.

public class ConnectThread extends AsyncTask  < private BluetoothDevice btDevice; public ConnectThread(BluetoothDevice device) < this.btDevice = device; >@Override protected String doInBackground(Void. params) < try < YourActivity.mmSocket = btDevice.createRfcommSocketToServiceRecord(Constants.MY_UUID); YourActivity.mBluetoothAdapter.cancelDiscovery(); YourActivity.mmSocket.connect(); >catch (Exception e) < e.printStackTrace(); return null; >return ""; > @Override protected void onPostExecute(final String result) < if (result != null)else > @Override protected void onCancelled() <> > 

This is how you can find the nearby bluetooth device and connect to them by using the MAC addresses stored previously.

Источник

Что такое адрес Bluetooth в Android и как его узнать

В наше время каждый знает, что такое Bluetooth. Более того, практически каждый умеет им пользоваться. Но мало кто углублялся в эту тему и пытался понять, как работает беспроводная связь. В этой статье мы разберем, что такое Bluetooth адрес в Android-устройствах, зачем он нужен и где его найти.

Что такое адрес сетевого адаптера

Сразу же стоит отметить, что Bluetooth – это такой же сетевой адаптер, как и Wi-Fi модуль или сетевая карта. Принцип построения связи во всех этих технологиях схож, отличия заключаются только в стандартах связи, скорости передачи данных и радиусе покрытия (касается только беспроводных адаптеров).

Итак, как и любой другой сетевой модуль, Bluetooth также имеет свой локальный MAC-address, например, C5:87:BR:7W:H3:40.

Это локальный адрес Bluetooth в Android-гаджетах. Конечно же, вы должны понимать, что каждому девайсу назначаются уникальные значения. То есть вы не сможете найти два устройства с одинаковыми адресами. Это необходимо для того, чтобы гаджеты могли друг друга обнаружить и идентифицировать. Кроме этого, при передаче информации нужен идентификатор, который определит получателя.

Читайте также:  Bluetooth android phone app

Например, когда вы отправляете письмо, вы указываете адрес проживания получателя (или в случае с электронной почтой вы указываете электронный адрес). Такой же принцип работает и с Bluetooth связью. То есть, по MAC-address Bluetooth определяется девайс, благодаря чему появляется возможность выполнить сопряжение.

Как правило, пользователям даже не нужно знать эти данные, так как гаджеты в подавляющем большинстве случаев автоматически определяют все нужные сведения. При сопряжении устройств вы видите только имя того или иного телефона (планшета или ноутбука), но под именем скрыты те самые MAC-addresses.

Другими словами, например, сопрягаясь для передачи файлов, гаджеты взаимодействуют именно по своим уникальным MAC-address. Как уже говорилось, пользователю необязательно их знать, но иногда это просто необходимо. Вот мы и подошли к вопросу, как узнать Bluetooth адрес в Android

Информация о сетевом модуле

Найти всю необходимую информацию о тех или иных модулях в телефоне или планшете на Android достаточно легко. При этом вам не придется искать и устанавливать никаких дополнительных приложений. Войдите в меню вашего смартфона (или планшета). Найдите ярлык «Настройки», как правило, он сделан в виде шестеренки.

Открываем настройки. Далее на более старых версиях Android следует перелистать страницу в самый низ. В самом конце вы увидите пункт «Об устройстве».

На новых версиях Android вам нужно перейти во вкладку «Опции» и опустить меню в самый низ. Здесь также будет пункт «Об устройстве».

Открываем его. Далее перейдите в категорию «Состояние». Осталось только найти строку «Bluetooth». Под ней вы увидите MAC-address.

Стоит помнить, что Bluetooth при этом должен быть включен. В противном случае в указанной строке будет отображаться надпись «Недоступно».

Как видите, все очень легко и просто. Но, как узнать MAC не своего, например, смартфона, а девайса, к которому нужно подключиться? Здесь также нет ничего сложного, но нужно предварительно подготовиться.

Подключаемся к интернету, открываем Play Market и в поисковой строке пишем название приложения – Bluetooth Address Finder. Выберите из результатов одноименное приложение и установите его. Далее открываем программу и нажимаем кнопку «Begin searching procedure». Ниже появится список MAC-address всех доступных вам на текущий момент девайсов, на которых включен Bluetooth.

Что такое адрес Bluetooth в Android и как его узнать: Видео

Источник

How to get Bluetooth MAC Address on Android

But, I my app has stopped unexpectedly. What is wrong with my code? using Android 2.3.6 (Samsung Galaxy mini) Update: I have used this code inside a Class extended AsyncTask . StackTrace:

09-04 01:09:43.671: E/AndroidRuntime(12372): FATAL EXCEPTION: AsyncTask #1 09-04 01:09:43.671: E/AndroidRuntime(12372): java.lang.RuntimeException: An error occured while executing doInBackground() 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.os.AsyncTask$3.done(AsyncTask.java:200) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.lang.Thread.run(Thread.java:1019) 09-04 01:09:43.671: E/AndroidRuntime(12372): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.os.Handler.(Handler.java:121) 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.bluetooth.BluetoothAdapter$1.(BluetoothAdapter.java:1117) 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.bluetooth.BluetoothAdapter.(BluetoothAdapter.java:1117) 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.bluetooth.BluetoothAdapter.getDefaultAdapter(BluetoothAdapter.java:437) 09-04 01:09:43.671: E/AndroidRuntime(12372): at org.radyabi.app.StepActivity$CollectDeviceCodes.doInBackground(StepActivity.java:119) 09-04 01:09:43.671: E/AndroidRuntime(12372): at org.radyabi.app.StepActivity$CollectDeviceCodes.doInBackground(StepActivity.java:1) 09-04 01:09:43.671: E/AndroidRuntime(12372): at android.os.AsyncTask$2.call(AsyncTask.java:185) 09-04 01:09:43.671: E/AndroidRuntime(12372): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 09-04 01:09:43.671: E/AndroidRuntime(12372): . 4 more 

Источник

Читайте также:  Заглушить сигнал блютуз колонки

Get Bluetooth local mac address in Marshmallow

Pre Marshmallow my app would obtain it’s device MAC address via BluetoothAdapter.getDefaultAdapter().getAddress(). Now with Marshmallow Android is returning 02:00:00:00:00:00 . I saw some link(sorry not sure where now) that said you need to add the additional permission

to be able to get it. However it isn’t working for me. Is there some additional permission needed to get the mac address? I am not sure it is pertinent here but the manifest also includes

9 Answers 9

zmarties is right but you can still get the mac address via reflection or Settings.Secure:

 String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address"); 

@Rilwan using reflection for hidden/blacklisted API will crash your app with next OS update and it is never correct solution, just temporal workaround.

android.provider.Settings.Secure.getString(context.getContentResolver(), «bluetooth_address») return null in Android 10

Access to the mac address has been deliberately removed:

To provide users with greater data protection, starting in this release, Android removes programmatic access to the device’s local hardware identifier for apps using the Wi-Fi and Bluetooth APIs.

Yes. I had read that. But the API 23 BluetoothAdapter has the following: /** * Default MAC address reported to a client that does not have the * android.permission.LOCAL_MAC_ADDRESS permission. * * @hide */ public static final String DEFAULT_MAC_ADDRESS = «02:00:00:00:00:00»; So that implies there is meant to be some way to get it. (Perhaps not implemented yet? I cling to hope.)

The LOCAL_MAC_ADDRESS permission can only be used by system apps and it’s unlikely that Google is going to change that.

You can access Mac address from the file «/sys/class/net/» + networkInterfaceName+ «/address» ,where networkInterfaceName can be wlan0 or eth1.But Its permission may be read-protected,so it may not work in some devices. I am also attaching the code part which i got from SO.

public static String getWifiMacAddress() < try < String interfaceName = "wlan0"; Listinterfaces = Collections .list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) < if (!intf.getName().equalsIgnoreCase(interfaceName)) < continue; >byte[] mac = intf.getHardwareAddress(); if (mac == null) < return ""; >StringBuilder buf = new StringBuilder(); for (byte aMac : mac) < buf.append(String.format("%02X:", aMac)); >if (buf.length() > 0) < buf.deleteCharAt(buf.length() - 1); >return buf.toString(); > > catch (Exception exp) < exp.printStackTrace(); >return ""; > 

Источник

Оцените статью
Adblock
detector