我嘗試在 Kotlin 上為 Flutter 創建自定義插件。我訪問了 methodChannel 并且能夠做到,但是當我想在 methodChannel 中使用藍牙服務時,我遇到了這個錯誤。我在 Kotlin 上做過,我的代碼運行正確。不同之處在于我的 kotlin 應用程式的類是 AppCompatActivity() 型別并具有 onCreate() 函式。當我將 onCreate 函式添加到我的scanner.kt 檔案時,我的問題沒有解決。我得到這個錯誤。
> E/MethodChannel#beacon_scanner: Failed to handle method call
> java.lang.IllegalStateException: System services not available to Activities before onCreate()
> at android.app.Activity.getSystemService(Activity.java:6868)
> at com.example.beacon_scanner.BeaconScannerPlugin$onMethodCall$bluetoothAdapter$2.invoke(BeaconScannerPlugin.kt:52)
> at com.example.beacon_scanner.BeaconScannerPlugin$onMethodCall$bluetoothAdapter$2.invoke(BeaconScannerPlugin.kt:49)
> at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
> at com.example.beacon_scanner.BeaconScannerPlugin.onMethodCall$lambda-0(BeaconScannerPlugin.kt:49)
> at com.example.beacon_scanner.BeaconScannerPlugin.onMethodCall(BeaconScannerPlugin.kt:57)
> at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
> at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:296)
> at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:320)
> at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown
> Source:12)
> at android.os.Handler.handleCallback(Handler.java:938)
> at android.os.Handler.dispatchMessage(Handler.java:99)
> at android.os.Looper.loopOnce(Looper.java:201)
> at android.os.Looper.loop(Looper.java:288)
> at android.app.ActivityThread.main(ActivityThread.java:7839)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
> E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled
> Exception: PlatformException(error, System services not available to
> Activities before onCreate(), null, java.lang.IllegalStateException:
> System services not available to Activities before onCreate()
> at android.app.Activity.getSystemService(Activity.java:6868)
> at com.example.beacon_scanner.BeaconScannerPlugin$onMethodCall$bluetoothAdapter$2.invoke(BeaconScannerPlugin.kt:52)
> at com.example.beacon_scanner.BeaconScannerPlugin$onMethodCall$bluetoothAdapter$2.invoke(BeaconScannerPlugin.kt:49)
> at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
> at com.example.beacon_scanner.BeaconScannerPlugin.onMethodCall$lambda-0(BeaconScannerPlugin.kt:49)
> at com.example.beacon_scanner.BeaconScannerPlugin.onMethodCall(BeaconScannerPlugin.kt:57)
> at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
> at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:296)
> at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:320)
> at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown
> Source:12)
> at android.os.Handler.handleCallback(Handler.java:938)
> at android.os.Handler.dispatchMessage(Handler.java:99)
> at android.os.Looper.loopOnce(Looper.java:201)
> at android.os.Looper.loop(Looper.java:288)
> at android.app.ActivityThread.main(ActivityThread.java:7839)
> at java.lang.reflect.Method.invoke(Native Method)
> at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
> )
> #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
> #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:177:18)
> <asynchronous suspension>
> #2 BeaconScanner.bluetoothIsActive (package:beacon_scanner/beacon_scanner.dart:14:12)
> <asynchronous suspension>
> #3 _MyAppState.getBtStatus (package:beacon_scanner_example/main.dart:50:17)
> <asynchronous suspension>
這就是我的代碼:
掃描儀.dart
class BeaconScanner {
static const MethodChannel _channel = MethodChannel('beacon_scanner');
static Future<String?> get platformVersion async {
final String? version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
static Future get bluetoothIsActive async {
return await _channel.invokeMethod('bluetoothIsActive');
}
static Future get sayHello async {
final btStatus = await _channel.invokeMethod('sayHello');
return btStatus.toString();
}
}
掃描儀.kt
class BeaconScannerPlugin: FlutterActivity(), FlutterPlugin, MethodCallHandler {
private lateinit var channel : MethodChannel
private val bluetoothAdapter: BluetoothAdapter by lazy{
(getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager).adapter
}
companion object {
private const val BLUETOOTH_PERMISSION_REQUEST_CODE = 9999
}
override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "beacon_scanner")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}
else if (call.method=="bluetoothIsActive") {
if(bluetoothAdapter != null){
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.BLUETOOTH_CONNECT
) != PackageManager.PERMISSION_GRANTED
) {
initializeBluetoothOrRequestPermission()
}
if(bluetoothAdapter.enable()){
result.success("bt status is ${bluetoothAdapter.isEnabled}")
Log.v("Scanner","ENABLED")
}
else {
initializeBluetoothOrRequestPermission()
}
}
}else if (call.method=="sayHello") {
result.success("bt status is HELLO YES")
}
else {
result.notImplemented()
}
}
private fun initializeBluetoothOrRequestPermission() {
val requiredPermissions = listOf(Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN)
val missingPermissions = requiredPermissions.filter { permission ->
ActivityCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED
}
if (missingPermissions.isEmpty()) {
} else {
ActivityCompat.requestPermissions(this, missingPermissions.toTypedArray(), BLUETOOTH_PERMISSION_REQUEST_CODE)
}
}
override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}
uj5u.com熱心網友回復:
你BeaconScannerPlugin是一個活動,正如錯誤堆疊跟蹤所說,它需要處于創建狀態,然后才能在getSystemService(Context.BLUETOOTH_SERVICE).
您應該將BeaconScannerPlugin實作更改為不依賴于介面FlutterActivity,而是使用ActivityAware介面。
ActivityAware將為您提供一個活動實體,您可以使用它來為您的插件獲取藍牙服務。
您可以在Flutter 官方網站上閱讀更多內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/440833.html
