4

我試圖使新的PhoneAccount使用我的實施ConnectionService。在文檔中說我需要用TelecomManager註冊一個新的PhoneAccount,然後在我的手機應用程序的設置中選擇它。Android:爲電信註冊新的PhoneAccount

這裏是我的代碼:

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); 

正如你可以看到,它創建了一個新的組件名稱是對我實施ConnectionService的點,然後創建一個新的PhoneAccountHandle其中我公司供應的組件名稱和唯一的帳戶名。然後,我在PhoneAccount buildes中提供PhoneAccountHandle以及標籤(名稱?),以創建新的PhoneAccount。最後,我在telecomManager中註冊帳戶。

當我打開手機應用程序時,沒有任何改變。我看不到我可以改變PhoneAccount的地方......任何想法?

謝謝!

+1

終於搞定了。仿真器似乎沒有提供選擇要使用的電話帳戶的方式。使用Xperia Z3,我可以在Settings> Call> Calling Accounts下找到它。請注意,您需要在構建器中提供一項功能(因爲默認值爲none,並且該帳戶不會顯示)。 – ProfessorChaos

+0

更新:可以在模擬器中更改以及TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS意圖。 – ProfessorChaos

+1

使用電話需要哪些功能? –

回答

3

我有一些信息,我只是爲了後代而離開這裏。

當構建PhoneAccount,你必須添加CAPABILITY_CALL_PROVIDER,如果你做和自己接聽電話,或CAPABILITY_CONNECTION_MANAGER如果要撥打或接聽使用內置PhoneAccount電話。如果沒有,你將不會出現在用戶界面中。

據我所知,沒有專門的API來檢查用戶是否已啓用您的PhoneAccount。但是,您可以使用TelecomManageraddNewIncomingCall爲此目的。只需提供一個Bundle包含一個布爾額外(命名任何你想要的),並設置布爾值爲true如果你真的接到一個電話或false如果你只是想做一個權限檢查(反之亦然)。然後你的執行ConnectionServiceonCreateIncomingConnection可以檢查您的額外費用並返回ConnectioncreateCanceledConnection如果您只是在進行權限檢查。這不會在通話記錄中註冊爲通話,並且鈴聲不會播放。如果您的PhoneAccount未啓用,則會拋出addNewIncomingCall,並且如果它成功則會拋出。

如上述註釋中所述,您可以提示用戶啓用PhoneAccount,使用TelecomManagerACTION_CHANGE_PHONE_ACCOUNTS。因爲用戶可以隨時啓用或禁用您的PhoneAccount,所以需要啓用PhoneAccount(如addNewIncomingCall)的所有操作都應放置在try區塊中。

+0

感謝您分享此信息。我不確定如何檢查是否啓用PhoneAccount,但您的方法是一個很好的解決方案。 –

0

作爲附錄j__m的回答是:我發現了一個方法來檢查,如果手機賬戶沒有建立呼叫激活:

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; 
} 

如同在Javadoc中陳述android.telecom.TelecomManager.getCallCapablePhoneAccounts( )

返回可用於撥打和接聽電話的可連接的PhoneAccountHandle列表。返回的列表僅包含那些已被用戶顯式啓用的帳戶。

+0

PermissionHelper - not found –

+0

如果您已經需要'READ_PHONE_STATE'權限,那麼這是一個很好的方法,但我希望沒有人需要權限才能執行此檢查。 –

+0

@VineeshTP:我用工具類PermissionHelper替換了它所執行的實際代碼。代碼示例現在應該一致。 – FightingDragon