Beiträge von benigern

    Meine App soll ohne Benutzerintervention ein File von Google Drive herunterladen und dazu habe ich einen API-Key erzeugen lassen. Doch wie wird der API-Key übergeben?


    Das zweite Problem, im build.gradle mussten zwei dependecies eingefügt werden:


    implementation("com.google.api-client:google-api-client-android:1.23.0")

    implementation("com.google.apis:google-api-services-drive:v3-rev136-1.25.0")


    und das ergibt eine Fehlermelung beim build:


    com.android.builder.merge.DuplicateRelativeFileException: 2 files found with path 'META-INF/DEPENDENCIES'.


    Kann mir bitte jemand weiterhelfen oder gibt es eine andere Lösung?

    Ich verbinde den CallScreeningServcie mithilfe von Messenger mit der MainActivity. Die Kommunikation zwischen Main und Service funktioniert von beiden Seite her ausgelöst problemlos. Wenn jedoch das erste Call-Ereignis, z.B. "ringing" geschieht, erscheint im Log eine RuntimeException, aus der ich nicht schlau werden und nicht sehen kann, was am Interface inkorrekt ist. Ich wäre dankbar, wenn mir jemand weiterhelfen kann.


    Logcat:


    2023-08-24 11:56:23.379 6731-6749 Parcel com.example.anrufdemo3 W **** enforceInterface() expected 'android.os.IMessenger' but read 'com.android.internal.telecom.ICallScreeningService'

    2023-08-24 11:56:23.380 6731-6749 Binder com.example.anrufdemo3 W Caught a RuntimeException from the binder stub implementation.

    java.lang.SecurityException: Binder invocation to an incorrect interface

    at android.os.Parcel.nativeEnforceInterface(Native Method)

    at android.os.Parcel.enforceInterface(Parcel.java:623)

    at android.os.IMessenger$Stub.onTransact(IMessenger.java:79)

    at android.os.Binder.execTransactInternal(Binder.java:1021)

    at android.os.Binder.execTransact(Binder.java:994)


    MyCallScreening.kt

    Ausschitte aus Main:


    bei meinem CallScreeningService springt onScrennCall nie an, obwohl der Service gebunden ist und läuft, da ich eine zusätzliche Funktion eingebaut habe und aufrufen kann. Was ist da der entscheidende Trick?

    Für das Problem mit TelecomManager.EndCall habe ich eine Lösung gefunden, die mit allen Versionen läuft. Vielleicht hilft das weiter.

    Eine Variable vom Typ Context ist nicht möglich, weil der Context nicht null sein darf. Es braucht eine andere Lösung. Alles was ich bisher gesehen habe, z.B. auf stackoverflow.com, funktioniert nicht. Also hier die Quizfrage: Wie lautet der korrekte Ersatz für this@MainActivity?

    Ich will den Permission Check von der MainAktivity in ein Objekt auslagern, dabei geht der context verloren. Wie krieg ich das wieder hin?

    HIer ist die MainActivity.kt


    Und hier Permission.kt und für this@MainActivity folgt die Fehlermeldung: unresolved Reference.

    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)

    }

    }

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