diff --git a/build.gradle b/build.gradle index a2a730e..6294d8e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bd17d6a..13ed43b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/lmbluetoothsdk/build.gradle b/lmbluetoothsdk/build.gradle index 2e32ec6..b050d5d 100755 --- a/lmbluetoothsdk/build.gradle +++ b/lmbluetoothsdk/build.gradle @@ -2,11 +2,11 @@ apply plugin: 'com.android.library' android { compileSdkVersion 25 - buildToolsVersion "25.0.0" + buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 - targetSdkVersion 23 + targetSdkVersion 25 versionCode 105 versionName "1.0.5" } @@ -20,4 +20,4 @@ android { dependencies { } -apply from: 'https://raw.githubusercontent.com/whilu/AndroidPublishLibrary/master/project/library/bintray_publish_sign.gradle' + diff --git a/sample/build.gradle b/sample/build.gradle index db5145c..c5b0897 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.3" defaultConfig { applicationId "co.lujun.sample" - minSdkVersion 9 - targetSdkVersion 23 + minSdkVersion 21 + targetSdkVersion 25 versionCode 1 versionName "1.0" } @@ -23,6 +23,6 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':lmbluetoothsdk') testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:design:25.3.1' } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 42d9c15..df16b19 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -4,6 +4,10 @@ + + + + + android:theme="@style/AppTheme.NoActionBar" + android:enabled="true" + android:exported="true"> @@ -24,7 +30,8 @@ + android:windowSoftInputMode="adjustPan" + android:exported="true"/> diff --git a/sample/src/main/java/co/lujun/sample/ChatActivity.java b/sample/src/main/java/co/lujun/sample/ChatActivity.java index ffda275..21102d8 100644 --- a/sample/src/main/java/co/lujun/sample/ChatActivity.java +++ b/sample/src/main/java/co/lujun/sample/ChatActivity.java @@ -1,24 +1,32 @@ package co.lujun.sample; import android.app.Activity; +import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHeadset; +import android.bluetooth.BluetoothManager; +import android.bluetooth.BluetoothProfile; +import android.content.Context; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; +import java.lang.reflect.Method; + import co.lujun.lmbluetoothsdk.BluetoothController; import co.lujun.lmbluetoothsdk.base.BluetoothListener; -import co.lujun.lmbluetoothsdk.base.State; /** * Author: lujun(http://blog.lujun.co) * Date: 2016-1-21 16:10 */ -public class ChatActivity extends Activity { +public class ChatActivity extends Activity{ private BluetoothController mBluetoothController; private Button btnDisconnect, btnSend; @@ -29,12 +37,37 @@ public class ChatActivity extends Activity { private String mMacAddress = "", mDeviceName = ""; private static final String TAG = "LMBluetoothSdk"; + private BluetoothHeadset bluetoothHeadset; + private boolean isServiceConnected = false; + private boolean isHeadsetConnected = false; + + private BluetoothDevice mDevice; + private BluetoothManager mBluetoothManager; + private BluetoothAdapter mBluetoothAdapter; + public BluetoothProfile headset; + public BluetoothProfile a2Dp; + - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat_main); + if (mBluetoothManager == null) { + mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + if (mBluetoothManager == null) { + Log.e(TAG, "Unable to initialize BluetoothManager."); + return ; + } + } + + mBluetoothAdapter = mBluetoothManager.getAdapter(); + mBluetoothAdapter.getProfileProxy(getApplicationContext(), mServiceListener, BluetoothProfile.HEADSET); + mBluetoothAdapter.getProfileProxy(getApplicationContext(), mA2dpServiceListener, BluetoothProfile.A2DP); + if (mBluetoothAdapter == null) { + Log.e(TAG, "Unable to obtain a BluetoothAdapter."); + return; + } + init(); } @@ -111,15 +144,37 @@ public void onClick(View v) { btnDisconnect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (mConnectState == State.STATE_CONNECTED) { - mBluetoothController.disconnect(); +// if (mConnectState == State.STATE_CONNECTED) { +// mBluetoothController.disconnect(); +//// unpair(mDevice); +// } + Method connect = null; + Method setPriority = null; + Method disconnectA2dp = null; + Method seta2dppriority = null; + try { + setPriority = BluetoothHeadset.class.getDeclaredMethod("setPriority", BluetoothDevice.class, int.class); + connect = BluetoothHeadset.class.getDeclaredMethod("disconnect", BluetoothDevice.class); + seta2dppriority = BluetoothA2dp.class.getDeclaredMethod("setPriority", BluetoothDevice.class, int.class); + disconnectA2dp = BluetoothA2dp.class.getDeclaredMethod("disconnect", BluetoothDevice.class); + setPriority.setAccessible(true); + setPriority.invoke(headset, mDevice, 100); + connect.setAccessible(true); + connect.invoke(headset, mDevice); + seta2dppriority.setAccessible(true); + seta2dppriority.invoke(a2Dp, mDevice, 100); + disconnectA2dp.setAccessible(true); + disconnectA2dp.invoke(a2Dp, mDevice); + } catch (Throwable e) { + e.printStackTrace(); } - finish(); +// finish(); } }); if (!TextUtils.isEmpty(mMacAddress)) { - mBluetoothController.connect(mMacAddress); +// mBluetoothController.connect(mMacAddress); + mDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress); }else { if (mBluetoothController.getConnectedDevice() == null){ return; @@ -130,4 +185,77 @@ public void onClick(View v) { tvDeviceMac.setText("MAC address: " + mMacAddress); } } + + +// @Override +// public void onServiceConnected() { +// isServiceConnected = true; +// if(!isHeadsetConnected && mDevice != null){ +// if(bluetoothHeadset.connectHeadset(mDevice)){ +// isHeadsetConnected = true; +// } +// } +// } +// +// @Override +// public void onServiceDisconnected() { +// isServiceConnected = false; +// } + + private BluetoothProfile.ServiceListener mServiceListener = new BluetoothProfile.ServiceListener() { + + @Override + public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (profile == BluetoothProfile.HEADSET) { + Log.i(TAG, "Headset proxy connected"); + headset = proxy; + try { + Method connect = BluetoothHeadset.class.getDeclaredMethod("connect", BluetoothDevice.class); + connect.setAccessible(true); + connect.invoke(proxy, mDevice); + + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + + @Override + public void onServiceDisconnected(int profile) { + headset = null; + Log.i(TAG, "Headset disconnected"); + } + }; + + private BluetoothProfile.ServiceListener mA2dpServiceListener = new BluetoothProfile.ServiceListener() { + @Override + public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (profile == BluetoothProfile.A2DP) { + a2Dp = proxy; + } + } + + @Override + public void onServiceDisconnected(int profile) { + a2Dp = null; + } + }; + + private static boolean unpair(BluetoothDevice device) { + Method sRmBd = null; + try { + sRmBd =BluetoothDevice.class.getMethod("removeBond", (Class[]) null); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + if (sRmBd != null) { + try { + sRmBd.invoke(device, (Object[]) null); + return true; + } catch (Throwable t) { + Log.e(TAG , ":" + "unpair: error", t); + } + } + return false; + } }