4

Ich versuche, eine neue PhoneAccount zu machen, um meine Implementierung von ConnectionService zu verwenden. In der Dokumentation heißt es, ich muss einen neuen PhoneAccount bei TelecomManager registrieren und ihn dann in den Einstellungen meiner Telefon-App auswählen.Android: Registrierung neuer PhoneAccount für Telekom

Hier ist mein Code:

TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); 

ComponentName componentName = newComponentName("se.example.connectionservicestandalonetest", "se.example.connectionservicestandalonetest.MyConnectionService"); 
PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, "Admin"); 
PhoneAccount phoneAccount = PhoneAccount.builder(phoneAccountHandle, "Admin").build(); 

telecomManager.registerPhoneAccount(phoneAccount); 

Wie Sie sehen können, erstellt es einen neuen Component, die auf meine Implementierung von Connection Punkte, dann eine neue PhoneAccountHandle schafft, wo ich die Component und einen eindeutigen Kontonamen angeben. Ich stelle dann das PhoneAccountHandle in den PhoneAccount buildes sowie label (ein Name?), Um ein neues PhoneAccount zu erstellen. Zuletzt registriere ich das Konto im telecomManager.

Wenn ich die Telefon-App öffne, hat sich nichts geändert. Ich sehe nicht, wo ich den PhoneAccount möglicherweise ändern könnte ... Irgendwelche Ideen?

Dank!

+1

Schließlich hat es funktioniert. Es scheint, als ob der Emulator keine Möglichkeit bietet, zu wählen, welches Telefonkonto verwendet werden soll. Mit einem Xperia Z3 konnte ich es unter Einstellungen> Anruf> Anrufende Accounts finden.Beachten Sie, dass Sie im Builder eine Funktion bereitstellen müssen (da der Standardwert keine ist und das Konto daher nicht angezeigt wird). – ProfessorChaos

+0

Update: Es ist möglich, im Emulator auch mit der Absicht TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS zu ändern. – ProfessorChaos

+1

Welche Funktionen sind erforderlich, damit es am Telefon funktioniert? –

Antwort

3

Ich habe ein paar Informationen, die ich hier für die Nachwelt hinterlassen werde.

Wenn Ihr PhoneAccount bauen, müssen Sie CAPABILITY_CALL_PROVIDER hinzufügen, wenn Sie Anrufe auf eigene Faust zu machen und empfangen, oder CAPABILITY_CONNECTION_MANAGER wenn Sie möchten, um Anrufe tätigen oder empfangen die eingebaute PhoneAccount verwenden. Ohne beides werden Sie nicht in der Benutzeroberfläche angezeigt.

Soweit ich sagen kann, gibt es keine dedizierte API für die Überprüfung, ob der Benutzer Ihre PhoneAccount aktiviert hat. Sie können jedoch TelecomManager verwenden. addNewIncomingCall für diesen Zweck. Stellen Sie einfach eine Bundle mit einem booleschen Zusatz (mit dem Namen was immer Sie wollen) und setzen Sie den booleschen Wert auf true, wenn Sie wirklich einen Anruf erhalten, oder false, wenn Sie nur eine Berechtigungsprüfung (oder umgekehrt) machen wollen. Dann Ihre Implementierung von ConnectionService. onCreateIncomingConnection können Sie Ihre zusätzlichen und Connection überprüfen. createCanceledConnection wenn Sie nur eine Berechtigungsprüfung durchführen. Dies wird nicht als Anruf in der Anrufliste registriert und der Klingelton wird nie abgespielt. addNewIncomingCall wird ausgelöst, wenn Ihre PhoneAccount nicht aktiviert ist, und wenn es erfolgreich ist.

Wie in den obigen Kommentaren erwähnt, können Sie den Benutzer auffordern, Ihre PhoneAccount mit TelecomManager zu aktivieren. ACTION_CHANGE_PHONE_ACCOUNTS. Da der Benutzer Ihre PhoneAccount jederzeit aktivieren oder deaktivieren kann, sollten alle Operationen, die eine Aktivierung von PhoneAccount (wie addNewIncomingCall) erfordern, in einen try Block gestellt werden.

+0

danke für das Teilen. Ich war mir nicht sicher, wie ich überprüfen kann, ob ein PhoneAccount aktiviert ist oder nicht, aber Ihre Methode ist eine großartige Lösung. –

0

Als Nachtrag zu j__m Antwort: Ich fand einen Weg, wenn das Telefonkonto zu überprüfen, ohne die Einrichtung einen Anruf aktiviert wird:

private boolean checkAccountConnection(Context context) { 
    boolean isConnected = false; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { 
      final List<PhoneAccountHandle> enabledAccounts = telecomManager.getCallCapablePhoneAccounts(); 
      for (PhoneAccountHandle account : enabledAccounts) { 
       if (account.getComponentName().getClassName().equals(MyConnectionService.class.getCanonicalName())) { 
        isConnected = true; 
        break; 
       } 
      } 
     } 

    } 
    return isConnected; 
} 

Wie in der Javadoc zu android.telecom.TelecomManager.getCallCapablePhoneAccounts angegeben ()

Gibt eine Liste von {@link PhoneAccountHandle} s zurück, die zum Tätigen und Empfangen von Anrufen verwendet werden können. Die zurückgegebene Liste enthält nur die Konten, die explizit vom Benutzer aktiviert wurden.

+0

PermissionHelper - nicht gefunden –

+0

Dies ist ein guter Weg, wenn Sie bereits 'READ_PHONE_STATE' Erlaubnis benötigen, obwohl ich hoffe, dass niemand diese Erlaubnis benötigt, nur um diese Überprüfung durchzuführen. –

+0

@VineeshTP: Ich habe die Utility-Klasse PermissionHelper durch den eigentlichen Code ersetzt, den sie ausführt. Das Codebeispiel sollte jetzt konsistent sein. – FightingDragon