Skip to content

Instantly share code, notes, and snippets.

@doubleo2
Created February 5, 2016 17:15
Show Gist options
  • Save doubleo2/cdfcfcb557e25bb7acec to your computer and use it in GitHub Desktop.
Save doubleo2/cdfcfcb557e25bb7acec to your computer and use it in GitHub Desktop.
/*
* Copyright 2016 Socket Mobile, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.socketmobile.android.utils;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
/**
* A utility class for getting the Bluetooth address
* <p>
* BluetoothUtils acts as a caching proxy for {@link BluetoothAdapter#getAddress()} so that your
* application can continue to programmatically retrieve a device's Bluetooth address even after
* the
* device is upgraded to Android 6.0 (Marshmallow).
*/
public class BluetoothUtils {
private static final String PREFS_FILE_KEY = BluetoothUtils.class.getName();
private static final String PREF_BDADDRESS = "BdAddress";
private static final String DUMMY_ADDRESS = "02:00:00:00:00:00";
/**
* Returns the Bluetooth address.
* <p>
* Tries to retrieve the Bluetooth address from {@SharedPreferences} before querying the
* {@link BluetoothAdapter} and if the adapter returns a valid address, the address is saved in
* {@link SharedPreferences} before it is returned.
* <p>
* This method creates a private instance of {@link SharedPreferences} for storing and
* retrieving the Bluetooth address. To provide your own {@link SharedPreferences} instance,
* use {@link #getAddress(Context, SharedPreferences, String)} instead.
*
* @param context an instance of {@link Context}
* @return the Bluetooth address or null if Bluetooth is not supported
*/
public static String getAddress(Context context) {
return getAddress(context, getSharedPrefs(context), PREF_BDADDRESS);
}
/**
* Returns the Bluetooth address.
* <p>
* Tries to retrieve the Bluetooth address from the instance of {@SharedPreferences} provided
* before querying the {@link BluetoothAdapter} and if the adapter returns a valid address, the
* address is saved in {@link SharedPreferences} before it is returned.
*
* @param context an instance of {@link Context}
* @param prefs an instance of {@link SharedPreferences}
* @param key the key for storing and retrieving the Bluetooth address in {@code prefs}
*/
public static String getAddress(Context context, SharedPreferences prefs, String key) {
if (prefs == null) {
throw new IllegalArgumentException("SharedPreferences cannot be null");
}
String address = prefs.getString(key, null);
if (address == null) {
address = getAddressFromAdapter(context);
if (!DUMMY_ADDRESS.equals(address)) {
putAddressIntoSharedPrefs(prefs, address);
}
}
return address;
}
private static BluetoothAdapter getAdapter(Context context) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return BluetoothAdapter.getDefaultAdapter();
} else {
BluetoothManager bm = (BluetoothManager) context
.getSystemService(Context.BLUETOOTH_SERVICE);
if (bm != null) {
return bm.getAdapter();
}
}
return null;
}
private static String getAddressFromAdapter(Context context) {
BluetoothAdapter adapter = getAdapter(context);
if (adapter != null) {
return adapter.getAddress();
}
return null;
}
private static SharedPreferences getSharedPrefs(Context context) {
return context.getSharedPreferences(PREFS_FILE_KEY, Context.MODE_PRIVATE);
}
private static void putAddressIntoSharedPrefs(SharedPreferences prefs, String address) {
SharedPreferences.Editor edit = prefs.edit();
edit.putString(PREF_BDADDRESS, address);
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD) {
edit.commit();
} else {
edit.apply();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment