diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2016-08-03 10:25:41 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@qt.io> | 2016-08-03 11:38:09 +0000 |
commit | af14b0d0e3b374f130e580c03dee6af1250cd6e1 (patch) | |
tree | d29585916011d31c8b645f79ba2bfa4d1f3894e9 /src | |
parent | 60d1ebac9e81619a24e66fc6defc3e0299491a9d (diff) |
Make Classic QtBluetooth work as an Android service
Change-Id: Ibde0242b058f728fd7e060b37f427c208325db13
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src')
3 files changed, 28 insertions, 14 deletions
diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java index b8de83ca..6b46ec0a 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver.java @@ -46,6 +46,7 @@ import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.util.Log; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -58,14 +59,15 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver @SuppressWarnings("WeakerAccess") long qtObject = 0; @SuppressWarnings("WeakerAccess") - static Activity qtactivity = null; + static Context qtContext = null; private static final int TURN_BT_ON = 3330; private static final int TURN_BT_DISCOVERABLE = 3331; + private static final String TAG = "QtBluetoothBroadcastReceiver"; public void onReceive(Context context, Intent intent) { - synchronized (qtactivity) { + synchronized (qtContext) { if (qtObject == 0) return; @@ -75,25 +77,30 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver public void unregisterReceiver() { - synchronized (qtactivity) { + synchronized (qtContext) { qtObject = 0; - qtactivity.unregisterReceiver(this); + qtContext.unregisterReceiver(this); } } public native void jniOnReceive(long qtObject, Context context, Intent intent); - static public void setActivity(Activity activity, Object activityDelegate) + static public void setContext(Context context) { - qtactivity = activity; + qtContext = context; } static public void setDiscoverable() { + if (!(qtContext instanceof android.app.Activity)) { + Log.w(TAG, "Discovery mode cannot be enabled from a service."); + return; + } + Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); try { - qtactivity.startActivityForResult(intent, TURN_BT_ON); + ((Activity)qtContext).startActivityForResult(intent, TURN_BT_ON); } catch (Exception ex) { ex.printStackTrace(); } @@ -101,9 +108,14 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver static public void setConnectable() { + if (!(qtContext instanceof android.app.Activity)) { + Log.w(TAG, "Connectable mode cannot be enabled from a service."); + return; + } + Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); try { - qtactivity.startActivityForResult(intent, TURN_BT_DISCOVERABLE); + ((Activity)qtContext).startActivityForResult(intent, TURN_BT_DISCOVERABLE); } catch (Exception ex) { ex.printStackTrace(); } @@ -142,7 +154,7 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver try { //Bluetooth service name Field f = Context.class.getField("BLUETOOTH_SERVICE"); - String serviceValueString = (String)f.get(qtactivity); + String serviceValueString = (String)f.get(qtContext); Class btProfileClz = Class.forName("android.bluetooth.BluetoothProfile"); @@ -155,7 +167,7 @@ public class QtBluetoothBroadcastReceiver extends BroadcastReceiver int gattServer = f.getInt(null); //get BluetoothManager instance - Object bluetoothManager = qtactivity.getSystemService(serviceValueString); + Object bluetoothManager = qtContext.getSystemService(serviceValueString); Class[] cArg = new Class[1]; cArg[0] = int.class; diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp index d2a088c4..50465017 100644 --- a/src/bluetooth/android/androidbroadcastreceiver.cpp +++ b/src/bluetooth/android/androidbroadcastreceiver.cpp @@ -53,8 +53,10 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) AndroidBroadcastReceiver::AndroidBroadcastReceiver(QObject* parent) : QObject(parent), valid(false) { - //get QtActivity - activityObject = QAndroidJniObject(QtAndroidPrivate::activity()); + // get Qt Context + // TODO: replace with QtAndroidPrivate::context() introduced by Qt 5.8 + contextObject = QAndroidJniObject(QtAndroidPrivate::activity() + ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); broadcastReceiverObject = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver"); if (!broadcastReceiverObject.isValid()) @@ -92,7 +94,7 @@ void AndroidBroadcastReceiver::addAction(const QAndroidJniObject &action) intentFilterObject.callMethod<void>("addAction", "(Ljava/lang/String;)V", action.object<jstring>()); - activityObject.callObjectMethod( + contextObject.callObjectMethod( "registerReceiver", "(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;", broadcastReceiverObject.object<jobject>(), diff --git a/src/bluetooth/android/androidbroadcastreceiver_p.h b/src/bluetooth/android/androidbroadcastreceiver_p.h index 1aa3049d..01d57992 100644 --- a/src/bluetooth/android/androidbroadcastreceiver_p.h +++ b/src/bluetooth/android/androidbroadcastreceiver_p.h @@ -79,7 +79,7 @@ protected: virtual void onReceiveLeScan(JNIEnv *env, jobject jBluetoothDevice, jint rssi) = 0; - QAndroidJniObject activityObject; + QAndroidJniObject contextObject; QAndroidJniObject intentFilterObject; QAndroidJniObject broadcastReceiverObject; bool valid; |