i am listing all paired devices,and it well work but now want to get Bluetooth signal strength of paired devices...i know it will get by use rssi but cannot implement get it continuously in my app..
plz me by giving suitable code as my code...my code is here...
public class Security extends Fragment implements OnClickListener{
private BluetoothAdapter BA;
private Set<BluetoothDevice>pairedDevices;
ArrayList<String> mylist = new ArrayList<String>();
//private Object ImageView;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.security, null);
BA = BluetoothAdapter.getDefaultAdapter();
/* starting the bluetooth*/
on(v);
pairedDevices = BA.getBondedDevices();
//length=4;
// int j=1;
for(BluetoothDevice bt : pairedDevices) {
mylist.add(bt.getName());
length=j;
j++;
bt.getBondState();
}
return v;
}
#Override
public void onResume() {
super.onResume();
// Toast.makeText(getActivity(), "On resume", Toast.LENGTH_LONG).show();
}
/*************************Bluetooth function****************************/
public void on(View view){
if (!BA.isEnabled()) {
Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOn, 0);
Toast.makeText(getActivity(),"Turned on"
,Toast.LENGTH_LONG).show();
} else{
// Toast.makeText(getActivity(),"Already on",
// Toast.LENGTH_LONG).show();
}
}
public void Discovery(View view) {
if(BA.isDiscovering()) {
BA.cancelDiscovery();
}
}
public void list(View view){
Toast.makeText(getActivity(),"Showing Paired Devices",
Toast.LENGTH_SHORT).show();
}
#Override
public void onClick(View v) {
for(int j=0;j<length;j++) {
if(v.getId()==j)
Toast.makeText(getActivity(), mylist.get(j), Toast.LENGTH_LONG).show();
//hand.update(run,1000);
}
}
}
You can get the signal from following code.
Code your activity
#Override
public void onCreate(Bundle savedInstanceState) {
.....
// Registering Broadcast. this will fire when Bluetoothdevice Found
registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));
}
private final BroadcastReceiver BroadcastReceiver = new BroadcastReceiver(){
#Override
public void onReceive(Context context, Intent intent) {
String mIntentAction = intent.getAction();
if(BluetoothDevice.ACTION_ACL_CONNECTED.equals(mIntentAction)) {
short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
String mDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
}
}
};
This broadcast will execute when your device will be connected to the remote device.
There are several other action on which you can fire this broadcast. have a look at here(BluetoothDevice)
Check following link for constant reading of RSSI
Tutorial to continuously measure the Bluetooth RSSI of a connected Android device (Java)
Output of link :
Then if you want to do it in continuously, you need to run it in a service or in a thread. So that you can even add time slots or sleep (waits) measuring the RSSI.
Related
I am developing a bluetooth chat following a Youtube tutorial, saveral days ago the function of search bluetooth devices availables around me, worked but suddenly to the next day, it did not nothing.
I tried search information and videos, maybe i changed something but nothing, after this for last chance i tried my app in a friendĀ“s mobile phone, and it worked well. So i do not know how can I proceed or how can i fix this.
I am using a Honor 9X (STK-LX1) with Android 10 and EMUI 10.0.0, the API is 30.
Now I test the app in another friendĀ“s mobile, and it worked.
public class DeviceListActivity extends AppCompatActivity {
private Context context;
private ListView listPairedDevices, listAvailableDevices;
private ArrayAdapter<String> adapterPairedDevices, adapterAvailableDevices;
private BluetoothAdapter bluetoothAdapter;
private ProgressBar progressScanDevices;
private Set<BluetoothDevice> foundDevices = new HashSet<>();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_list);
context = this;
init();
}
private void init(){
listPairedDevices = findViewById(R.id.list_paired_devices);
listAvailableDevices = findViewById(R.id.list_available_devices);
progressScanDevices = findViewById(R.id.progress_scan_devices);
adapterPairedDevices = new ArrayAdapter<String>(context,R.layout.device_list_item);
adapterAvailableDevices = new ArrayAdapter<String>(context, R.layout.device_list_item);
listPairedDevices.setAdapter(adapterPairedDevices);
listAvailableDevices.setAdapter(adapterAvailableDevices);
listAvailableDevices.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String info = ((TextView)view).getText().toString();
String mac = info.substring(info.length()-17);
Intent intent = new Intent();
intent.putExtra("deviceAddress",mac);
setResult(RESULT_OK,intent);
finish();
}
});
listPairedDevices.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String info = ((TextView)view).getText().toString();
String address = info.substring(info.length()-17);
Intent intent = new Intent();
intent.putExtra("deviceAddress",address);
setResult(RESULT_OK,intent);
finish();
}
});
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
if(pairedDevices != null && pairedDevices.size()>0){
for( BluetoothDevice device: pairedDevices){
adapterPairedDevices.add(device.getName() + "\n"+ device.getAddress());
}
}
IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(bluetoothDeviceListener,intentFilter);
IntentFilter intentFilter1 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(bluetoothDeviceListener,intentFilter1);
IntentFilter intentFilter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
registerReceiver(bluetoothDeviceListener,intentFilter2);
}
private BroadcastReceiver bluetoothDeviceListener = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
String deviceName = device.getName();
if(deviceName!=null){
if(foundDevices.contains(device))
return;
foundDevices.add(device);
adapterAvailableDevices.add(device.getName() + "\n" + device.getAddress());
}
}
}else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
progressScanDevices.setVisibility(View.GONE);
if(adapterAvailableDevices.getCount() == 0){
Toast.makeText(context, "No new devices found",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "Click on the device to start the chat",Toast.LENGTH_SHORT).show();
}
}else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
}
}
};
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_device_list, menu);
return super.onCreateOptionsMenu(menu);
}
#Override
public boolean onOptionsItemSelected(#NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.menu_scan_devices:
scanDevices();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void scanDevices(){
progressScanDevices.setVisibility(View.VISIBLE);
adapterAvailableDevices.clear();
//Toast.makeText(context, "Scan Devices",Toast.LENGTH_SHORT).show();
if(bluetoothAdapter.isDiscovering()){
bluetoothAdapter.cancelDiscovery();
}
bluetoothAdapter.startDiscovery();
}
}
Edit 1: I put Log.e("Tag 1", "Start search") at the end of the function scanDevices and another Log.e("Tag2","BroadcastReceiver") inside the onReceive function of BroadcastReceiver
When i use the Honor 9x, only appears the first Log.e, but when i use the anothers mobile phones, it appears the first and second.
Edit 2: I have the uses permission on my manifest, BLUETOOTH_ADMIN, BLUETOOTH, ACCESS_FINE_LOCATION.
I would appreciate any help.
I'm learning to code for Android, my first project uses bluetooth so I thought I'd start there. Basically I'm trying to scan for the other available bluetooth device with the press of a button, and display its name in a textview.
I register a BroadcastReceiver (mReceiver) with an ACTION_FOUND filter. I know I'm starting discovery correctly since other devices can see me, but I can't get their names. Debugging through AS seems to show that my instance for mReceiver is null.
public class MainActivity extends AppCompatActivity {
private Scanner_Bluetooth mainBLScanner;
public BroadcastReceiver mReceiver;
public int DISCOVERY_REQUEST = 1;
public static final String[] runtimePermissions = {};
public static final int LOCATION_PERMISSION_IDENTIFIER = 1;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonConnect = (Button) findViewById(R.id.buttonBT);
final TextView tv_name =(TextView)findViewById(R.id.tv_name);
mainBLScanner = new Scanner_Bluetooth(this, 5000, -75);
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
mReceiver = new BroadcastReceiver(getApplicationContext());
registerReceiver(mReceiver, filter);
View.OnClickListener listener = new View.OnClickListener() {
#Override
public void onClick(View view) {
mainBLScanner.Start();
tv_name.setText(mReceiver.getDeviceName());
}
};
buttonConnect.setOnClickListener(listener);
}
#Override
protected void onDestroy() {
unregisterReceiver(mReceiver);
super.onDestroy();
}
#Override
protected void onStop() {
unregisterReceiver(mReceiver);
super.onStop();
}
And this is how I implemented BroadcastReceiver
public class BroadcastReceiver extends android.content.BroadcastReceiver {
private String deviceName = "DUMMY";
private String deviceHardwareAddress;
Context activityContext;
private static final String TAG = "BroadcastReceiver";
public BroadcastReceiver(Context activityContext) {
this.activityContext = activityContext;
}
public String getDeviceName(){
return deviceName;
}
public String getAddress(){
return deviceHardwareAddress;
}
//this detects when bluetooth is on/off
#Override
public void onReceive(Context context, Intent intent) {
final String sAction = intent.getAction();
Log.d(TAG, "start onReceive: " + sAction);
if (sAction.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
switch (state) {
case BluetoothAdapter.STATE_OFF:
Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_LONG).show();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_LONG).show();
break;
case BluetoothAdapter.STATE_ON:
Toast.makeText(context, "Bluetooth is on", Toast.LENGTH_LONG).show();
break;
case BluetoothAdapter.STATE_TURNING_ON:
Toast.makeText(context, "Bluetooth is turning on", Toast.LENGTH_LONG).show();
break;
default:
break;
}
if (BluetoothDevice.ACTION_FOUND.equals(sAction)) {
Log.d(TAG, " Action_Found");
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context,"Device Found!!",Toast.LENGTH_LONG).show();
this.deviceName = device.getName();
this.deviceHardwareAddress = device.getAddress(); // MAC address
}
}
}}
In my manifest I have both Bluetooth and BluetoothAdmin permissions. Also Coarse & Fine access.
i'm trying to create an application and wish it detects the device which is already connected with the phone if it is near to it that's because i want to unlock the phone when the device is too close with the phone!
I've already searched on Google on the rssi but the problem is that it works only if the device doesn't have any connection with the phone !
this is the code wish it have tryed
public class RSSIActivity extends Activity {
private BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter();
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rssi);
registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
Button boton = (Button) findViewById(R.id.button1);
boton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
BTAdapter.startDiscovery();
}
});
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_rssi, menu);
return true;
}
private final BroadcastReceiver receiver = new BroadcastReceiver(){
#Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)) {
int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
TextView rssi_msg = (TextView) findViewById(R.id.textView1);
rssi_msg.setText(rssi_msg.getText() + name + " => " + rssi + "dBm\n");
}
}
};
}
but in my case the device is already connected with the phone using Bluetooth.
any suggestions ?
thank you
I'm trying to make an Android app that will scan for a certain Bluetooth device as a background service. Once the phone is within a certain range of the Bluetooth device, measured by reading the RSSI, the background service will start an Activity displayed to the user. If the phone is moved out of range of the Bluetooth device, (after the RSSI value is beyond a certain threshold,) the Activity should be killed.
Here is the code for the background service:
public class BeaconScanService extends Service implements BluetoothAdapter.LeScanCallback {
private Service self = this;
public static final String UNLOCK = "unlock";
public static final String STATUS = "status";
public static final String SIGNAL = "signal";
public static final String GET_SIGNAL = "get_signal";
//desired device to find
private static final String targetMAC = "E1:BE:A8:1A:8B:A0";
//class to handle saving RSSI values and detecting Bluetooth proximity
private proxDetector proxy;
//boolean to determine if phone is in BT range
static boolean inProx = false;
private BluetoothAdapter mBluetoothAdapter;
#Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
#Override
public void onCreate() {
super.onCreate();
//Proximity Detector
proxy = new proxDetector();
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
}
#Override
public int onStartCommand(Intent intent, int flags, int startId){
/*
* We need to enforce that Bluetooth is first enabled, and take the
* user to settings to enable it if they have not done so.
*/
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
//Bluetooth is disabled
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
enableBtIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(enableBtIntent);
}
/*
* Check for Bluetooth LE Support. In production, our manifest entry will keep this
* from installing on these devices, but this will allow test devices or other
* sideloads to report whether or not the feature exists.
*/
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "No LE Support.", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
//Begin scanning for LE devices
startScan();
return START_STICKY;
}
#Override
public void onDestroy() {
super.onDestroy();
//Cancel any scans in progress
mHandler.removeCallbacks(mStopRunnable);
mHandler.removeCallbacks(mStartRunnable);
mBluetoothAdapter.stopLeScan(this);
}
private Runnable mStopRunnable = new Runnable() {
#Override
public void run() {
stopScan();
}
};
private Runnable mStartRunnable = new Runnable() {
#Override
public void run() {
startScan();
}
};
private void startScan() {
Toast.makeText(this, "Scanning", Toast.LENGTH_SHORT).show();
//Scan for Bluetooth device with specified MAC
mBluetoothAdapter.startLeScan(this);
mHandler.postDelayed(mStopRunnable, 5000);
}
private void stopScan() {
Toast.makeText(this, "Not Scanning", Toast.LENGTH_SHORT).show();
mBluetoothAdapter.stopLeScan(this);
mHandler.postDelayed(mStartRunnable, 2500);
}
/* BluetoothAdapter.LeScanCallback */
#Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
/*
* Create a new beacon and pass it up to the main thread
*/
Toast.makeText(self, "OnLeScan", Toast.LENGTH_SHORT).show();
BT_Beacon beacon = new BT_Beacon(device.getAddress(), rssi);
mHandler.sendMessage(Message.obtain(null, 0, beacon));
}
/*
* We have a Handler to process scan results on the main thread
*/
private Handler mHandler = new Handler() {
#Override
public void handleMessage(Message msg) {
Toast.makeText(self, "Handlering", Toast.LENGTH_SHORT).show();
BT_Beacon beacon = (BT_Beacon) msg.obj;
if(beacon.getAddress().equals(targetMAC)){//Only look for target device
Toast.makeText(self, String.format("%ddBm", beacon.getSignal()), Toast.LENGTH_SHORT).show();
//HANDLE PROXIMITY DETECTION
Intent i1 = new Intent(UNLOCK);
proxy.processProx(beacon.getSignal());
Intent i2 = new Intent(SIGNAL);
i2.putExtra(GET_SIGNAL, proxy.prox);
sendBroadcast(i2);
if(proxy.crossedLine()){
i1.putExtra(STATUS, 1);
sendBroadcast(i1);
inProx = true;
Intent i = new Intent(self,MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}else{
i1.putExtra(STATUS, 0);
sendBroadcast(i1);
inProx = false;
}
}
}
};
}
Ultimately I want this background service to be started on boot, but for testing purposes, I am able to create or destroy this service from an Activity that should also display the RSSI value:
public class MainActivity extends Activity implements OnClickListener {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnScan = (Button) findViewById(R.id.btnScan);
Button btnUnscan = (Button) findViewById(R.id.btnUnscan);
btnScan.setOnClickListener(this);
btnUnscan.setOnClickListener(this);
}
#Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(BeaconScanService.SIGNAL));
}
#Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnScan:
Intent i = new Intent(this,BeaconScanService.class);
startService(i);
break;
case R.id.btnUnscan:
Intent i = new Intent(this,BeaconScanService.class);
stopService(i);
break;
}
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if(bundle != null) {
int sig = bundle.getInt(BeaconScanService.GET_SIGNAL);
TextView rssiView = (TextView) findViewById(R.id.text_rssi);
rssiView.setText(String.format("%ddBm", sig));
}
}
};
}
This is the layout for for MainActivity:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
android:paddingBottom="#dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button
android:id="#+id/btnScan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scan"/>
<Button
android:id="#+id/btnUnscan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Scan"
android:layout_below="#+id/btnScan"/>
<TextView
android:id="#+id/text_rssi"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:textAppearance="?android:attr/textAppearanceListItem"
android:text="dBm"
android:layout_below="#+id/btnUnscan"/>
</RelativeLayout>
in the activity that is started and ended by the BeaconScanService, the BroadcastReceiver is registered like this:
#Override
protected void onResume() {
super.onResume();
registerReceiver(beaconScanReceiver, new IntentFilter(BeaconScanService.UNLOCK));
}
and the BroadcastReceiver looks like this:
private final BroadcastReceiver beaconScanReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if(bundle != null) {
int status = bundle.getInt(BeaconScanService.STATUS);
if(status == 0) {
finish();
}
}
}
};
When I run this code, I can start and stop the BeaconScanService fine, and I know the service is scanning for the Bluetooth device due to debug Toasts being displayed. As far as I can tell, the code breaks down somewhere in the Handler of the service. No RSSI value is displayed in the TextView, and MyActivity is not started when the phone is brought close enough to the Bluetooth device.
I'm not too familiar with the interprocess communication aspects of Android programming, so I'm probably doing something wrong there. Any thoughts?
I have two activities Main nd AvaiableDevices in Main activity i have a button btnAdvc in AvailableDevices
public class MainActivity extends Activity
{
Button btnAdvc;
Button btnPdvc;
Button btnDdvc;
Button btnMdvc;
public BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
public static final int REQUEST_ENABLE_BT = 1;
public static UUID MY_UUID=null;
public BluetoothServerSocket mmServerSocket;
public void onCreate(Bundle savedInstanceState)
{
try{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MY_UUID= UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
//Function enbling Bluetooth
enableBluetooth();
///Function to initialize components
init();
//Calling AvailableDevices class's method searchDevice to get AvailableDevices
btnAdvc.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
call();
}
});
}catch(Exception e){Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();}
}
public void init()
{
btnAdvc=(Button)findViewById(R.id.btnAdvc);
btnPdvc=(Button)findViewById(R.id.btnPdvc);
btnDdvc=(Button)findViewById(R.id.btnDdvc);
btnMdvc=(Button)findViewById(R.id.btnMdvc);
}
public void call()
{
Intent intent=new Intent(this,AvailableDevices.class);
startActivity(intent);
}
}
I have a method searchDevices() in AvailableDevices activity
public class AvailableDevices extends Activity
{
public BluetoothAdapter mBluetoothAdapter;
public BluetoothDevice device;
public ListView lv;//for Available Devices
public ArrayList<String> s=new ArrayList<String>();
public HashSet<String> hs = new HashSet<String>();
public ArrayAdapter<String> adapter;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_available_devices);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, s);
lv=(ListView)findViewById(R.id.listView1);
Intent intent=getIntent();
}
public AvailableDevices(BluetoothAdapter bt)
{
mBluetoothAdapter =bt;
}
public void searchDevice()
{
if(mBluetoothAdapter.isEnabled())
{
mBluetoothAdapter.startDiscovery();
// Create a BroadcastReceiver for ACTION_FOUND
final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action))
{
try{
// Get the BluetoothDevice object from the Intent
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
s.add(device.getName()+ "\n" + "#"+ device.getAddress());
//To avoid duplicate devices put it in to hash set which doesn't allow duplicates
hs.addAll(s);
//Clear all the devices in String array S
s.clear();
//Replace with hash set
s.addAll(hs);
//
lv.setAdapter(adapter);
}catch(Exception e){Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();}
}
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
//A local bluetooth device to Hold the selected device to connect
BluetoothDevice devtoconnect;
public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
{
try{
mBluetoothAdapter.cancelDiscovery();
//A local String array to hold the Name and address of the selected bluetooth device
String[] separated = adapter.getItem(position).split("#");
if(mBluetoothAdapter.checkBluetoothAddress(separated[1])==true)
{
devtoconnect = mBluetoothAdapter.getRemoteDevice(separated[1]);
}
// Create object of Connect Thread Class to get connection
// ConnectThread t1=new ConnectThread(devtoconnect);
}catch(Exception e){}
}//Closes onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
}); //Closes lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
}//Coses function onReceive
};//Closes BroadcastReceiver
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
}//if
}// function searchDevices
}
when i click in btnAdvc of main the searchDevices() method of AvailableDevices activity should be called how can i do it?
you can use broadcast messages. after the button click send a broadcast. and in the other activity register a BroadcastReceiver which will handle the brodcast. so whenever you have got the desired message then call the method in second activity.
From the code provided, it looks like searchDevices() method is not a kind of independent method and uses variables/properties decalred in AvaiableDevices class. So probably what you can try is some like
Intent intent=new Intent(this,AvailableDevices.class);
intent.putExtra("CallSearchDevices", true);
startActivity(intent);
And in AvailableDevices at the end of the onCreate method,
Intent intent=getIntent();
boolean flag = intent.getBooleanExtra("CallSearchDevices", false);
if (flag){
searchDevices();
}
I hope this helps
You should declare your method static so you can call it like that AvailableDevices.searchDevices() from your other activity