Contract für BluetoothAdapter.ACTION_REQUEST_ENABLE

  • Die Methode startActivityForResult() ist "deprecated" und stattdessen sollten Contrats verwendet werden. Es gibt vordefinierte Contracts für verschiedene Fälle, aber nicht für alles, nicht für Bluetooth. Mit eigenen Contracts können elegante Lösungen implementiert werden. Zum Starten von eigenen Activities findet sich eine Anleitung bei https://wajahatkarim.com/2020/…lts-api-onactivityresult/ und es funktioniert.

    Aber meine Lösung um Bluetooth zu aktivieren funktioniert nicht. Ich wäre dankbar, wenn jemand den entscheidenden Tipp geben könnte, wie der Contract aussehen muss, um Bluetooth in "createIntent" zu aktivieren.


    --------------------------------------------------------------------------

    ...

    private val myLauncher = registerForActivityResult(MyActivityContract()) {

    result -> activityResultCallback(result) }

    ...

    if ((state == BluetoothState.Disabled) && (Build.VERSION.SDK_INT < 31 ||

    ActivityCompat.checkSelfPermission(this,

    Manifest.permission.BLUETOOTH_CONNECT) == PERMISSION_GRANTED)) {

    // val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)

    // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BLUETOOTH)

    myLauncher.launch(BluetoothAdapter.ACTION_REQUEST_ENABLE) // ersetzt auskommentierte Zeilen

    }

    ...

    private fun activityResultCallback(result: Boolean) {

    // result auswerten, ersetzt onActivityResult()

    }

    ...

    -------------- MyActivityContract.kt----------------------------------------

    package com.example.bluetoothdemo1


    import android.app.Activity

    import android.bluetooth.BluetoothAdapter

    import android.content.Context

    import android.content.Intent

    import androidx.activity.result.contract.ActivityResultContract


    class MyActivityContract : ActivityResultContract<String, Boolean>() {


    override fun createIntent(context: Context, input: String): Intent {

    val intent = Intent(context, BluetoothAdapter::class.java) // <- funktoniert so nicht!!!

    intent.putParcelableArrayListExtra(input, null) // warum?

    return intent

    }


    override fun parseResult(resultCode: Int, intent: Intent?): Boolean {

    return (resultCode == Activity.RESULT_OK)

    }

    }

    --------------------------------------------------------------------------------

  • Zitat

    val intent = Intent(context, BluetoothAdapter::class.java) // <- funktoniert so nicht!!!

    Die Klasse BluetoothAdapter ist eine Klasse von Android also vom System und nicht vom deinem Projekt.


    Das was du machen willst ist ein direkter „Explizite Intents“ damit kannst du eine Klasse aus deinem Projekt aufrufen.


    Du willst eine App von System aufrufen dafür ist der „Implizite Intent“ gedacht.


    Willst du einen direkten Intend dann musst du eine Klasse schreiben die von der Adapter Klasse erbst.



    Intent



    Code
    val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!