Hello Friends ,
Today, I am sharing my another blog on Bluetooth Tethering. In this tutorial
we can programmatically turn on and off Bluetooth Tethering.

Here the code:
1. BluetoothTethering.java
2. BTPanServiceListener.java
Today, I am sharing my another blog on Bluetooth Tethering. In this tutorial
we can programmatically turn on and off Bluetooth Tethering.

Here the code:
1. BluetoothTethering.java
package com.solutions.developer.android.com.bluetoothtethering;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class BluetoothTethering extends AppCompatActivity {
BluetoothAdapter mBluetoothAdapter = null;
Class classBluetoothPan = null;
Constructor BTPanCtor = null;
Object BTSrvInstance = null;
Class noparams[] = {};
Method mIsBTTetheringOn;
public static Switch toggle ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bluetooth_tethering);
toggle = (Switch) findViewById(R.id.wifi_switch);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
try {
mBluetoothAdapter = getBTAdapter();
mBluetoothAdapter.enable();
Thread.sleep(100);
toggleTethering();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_bluetooth_tethering, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void toggleTethering() {
Context MyContext = getApplicationContext();
mBluetoothAdapter = getBTAdapter();
String sClassName = "android.bluetooth.BluetoothPan";
try {
classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
BTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
BTPanCtor.setAccessible(true);
BTSrvInstance = BTPanCtor.newInstance(MyContext, new BTPanServiceListener(MyContext));
Thread.sleep(250);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressLint("NewApi")
private BluetoothAdapter getBTAdapter() {
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
return BluetoothAdapter.getDefaultAdapter();
else {
BluetoothManager bm = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
return bm.getAdapter();
}
}
public static void changeToggleState(boolean state) {
try{
if(state){
toggle.setChecked(BTPanServiceListener.state);
}else {
toggle.setChecked(BTPanServiceListener.state);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
2. BTPanServiceListener.java
package com.solutions.developer.android.com.bluetoothtethering;
import java.lang.reflect.InvocationTargetException;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
public class BTPanServiceListener implements BluetoothProfile.ServiceListener {
private final Context context;
public static boolean state = false;
public BTPanServiceListener(final Context context) {
this.context = context;
}
@Override
public void onServiceConnected(final int profile,
final BluetoothProfile proxy) {
//Some code must be here or the compiler will optimize away this callback.
Log.i("MyApp", "BTPan proxy connected");
try {
boolean nowVal = ((Boolean) proxy.getClass().getMethod("isTetheringOn", new Class[0]).invoke(proxy, new Object[0])).booleanValue();
if (nowVal) {
proxy.getClass().getMethod("setBluetoothTethering", new Class[]{Boolean.TYPE}).invoke(proxy, new Object[]{Boolean.valueOf(false)});
Toast.makeText(context, "Turning bluetooth tethering off", Toast.LENGTH_SHORT).show();
state = false;
} else {
proxy.getClass().getMethod("setBluetoothTethering", new Class[]{Boolean.TYPE}).invoke(proxy, new Object[]{Boolean.valueOf(true)});
Toast.makeText(context, "Turning bluetooth tethering on", Toast.LENGTH_SHORT).show();
state = true;
}
BluetoothTethering.changeToggleState(state);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(final int profile) {
}
}
Download Complete Code : BluetoothTethering
Hope this will help some one.
Enjoy coding....... :)









