[英]Android custom dialer app, connections are not activated
我正在嘗試實現一個基本的撥號應用程序,它也應該處理來電。 場景是用戶將應用程序設置為默認撥號程序,從那時起,每個傳入和傳出呼叫都應到達應用程序的 ConnectionService 實現。
我不想覆蓋內置的調用 UI,我只需要向 Connection 回調添加一些額外的邏輯。 例如,我想發送廣播意圖,何時回答 Conenction 等。
基於這個文檔,我想我應該實現一個系統管理的 ConnectionService。
我已經通過以下方式實現了 ConnectionService,它運行良好,在傳入或傳出呼叫的情況下調用回調:
public class DialerConnectionService extends ConnectionService {
NotificationManagerUtil notificationManager;
public DialerConnectionService() {
notificationManager = NotificationManagerUtil.getInstance();
}
@Override
public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
return createConnection(request, false);
}
@Override
public void onCreateOutgoingConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
notificationManager.createToast(getApplicationContext(), getString(R.string.error_place_outgoing_call));
}
@Override
public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
return createConnection(request, true);
}
@Override
public void onCreateIncomingConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
notificationManager.createToast(getApplicationContext(), getString(R.string.error_create_incoming_call));
}
private TelecomConnection createConnection(ConnectionRequest request, boolean isIncoming) {
TelecomConnection connection = new TelecomConnection(getApplicationContext(), isIncoming);
connection.setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
String normalizedPhoneNumber = ContactsUtil.getInstance().normalizePhoneNumberFromUri(request.getAddress());
connection.setNormalizedPhoneNumber(normalizedPhoneNumber);
connection.setCallerDisplayName(ContactsUtil.getInstance().getContactName(getApplicationContext(), normalizedPhoneNumber), TelecomManager.PRESENTATION_ALLOWED);
connection.setExtras(request.getExtras());
if (isIncoming) {
connection.setRinging();
} else {
connection.setDialing();
}
connection.setInitializing();
CallManager.getInstance().addConnection(connection);
return connection;
}
}
問題是,在情況下,我注冊的能力PHONEACCOUNT PhoneAccount.CAPABILITY_CONNECTION_MANAGER
,創建調用不成了-由於缺乏一個更好的詞-積極,但連接的回調被正確調用。 所以我可以發起一個撥出電話,但另一部電話永遠不會收到來電通知。 或者,如果我從另一部電話發起呼叫,運行我的應用程序的設備將進入其 onCreateIncomingConnection() 方法,我將能夠接聽該呼叫,但發起電話仍將撥號。
我已經按照以下方式注冊了 PhoneAccount,我懷疑問題出在這里:
public boolean checkAccountHandler(Context ctx) {
PhoneAccountHandle phoneAccountHandle = getPhoneAccountHandle(ctx);
telecomManager = (TelecomManager) ctx.getSystemService(Context.TELECOM_SERVICE);
PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle);
if (phoneAccount == null){
PhoneAccount account = PhoneAccount.builder(phoneAccountHandle, PHONE_ACCOUNT_LABEL)
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
.addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
.build();
telecomManager.registerPhoneAccount(account);
return false;
}
return true;
}
這樣注冊的帳戶就不會出現在android的設置中,所以我不能讓用戶啟用它。 有沒有可能,這是問題的主要原因?
我的清單使用以下權限:
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
這里是 acctivity 和 ConnectionService 實現的注冊:
<activity
android:name=".activity.MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name=".service.DialerConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
Bundle extras = new Bundle();
extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true);
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, telecomManager.getUserSelectedOutgoingPhoneAccount());//This is the most important thing
telecomManager.placeCall(uri,extras);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.