Forum Discussion
Android Native Visual Voicemail Trouble
- Hace 4 años
UPDATED 7/13/2021:
For folks wondering if their Native VVM app will work on T-Mobile's network, here's some helpful info. The native VVM app on Non-T-Mobile devices isn't something T-Mobile can guarantee will work with the VVM service. This goes for other native apps as well. We recommend folks download T-Mobile Visual Voicemail app I've linked below and use the VVM service through that app. The second link I posted below is for troubleshooting if you happen to run into any issues.
We have a couple articles that can help with this. Check out the two links below in relationship to the issue.
App de Correo de voz visual de T-Mobile
Solución de problemas del correo de voz
Long and detailed post incoming.
Digging through the android source code, checking into how the process works. (Code available here: https://android.googlesource.com)
What we see in the logs is this, (and I'll break down the bits as the post goes along)
Phone realizes it's not activated, starts task. This can also happen when a user presses the "Try again" button in the failed activation screen.
I Dialer : OmtpVvmSyncReceiver - Unactivated account ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, ***, UserHandle{0} found, activating
Activation task created and executed.
I Dialer : VvmTaskReceiver - task received
I Dialer : VvmTaskReceiver - scheduling new job
I Dialer : TaskSchedulerJobService - scheduling job with 1 tasks
I Dialer : TaskSchedulerJobService - running job instantly.
I Dialer : TaskSchedulerJobService - job 34 scheduled
I Dialer : TaskSchedulerJobService - starting 34
I Dialer : VvmTaskExecutor - onStartJob
I Dialer : Task.createTask - create task:com.android.voicemail.impl.ActivationTask
I Dialer : VvmTaskExecutor - executing task com.android.voicemail.impl.ActivationTask@b732577
Activation begins, SMS sent to get config
I Dialer : VoicemailErrorAlert.updateStatus - isModal: false, Activating visual voicemail
I QImsService: ImsSmsImpl : sendSms:: token:4 msgRef:0 format:3gpp isRetry:false
I QImsService: ImsSenderRxr : sendSms over IImsRadio with format:3gpp
I QImsService: ImsSenderRxr : [0026]> REQUEST_SEND_IMS_SMS [SUB0]
SMS response received by phone
I QImsService: ImsRadioResponse : Ims sms response received
I QImsService: ImsSenderRxr : [0026]< REQUEST_SEND_IMS_SMS { mMessageRef = 144, mSendSmsResult = 1, mSendSmsReason = 0}[SUB0]
I QImsService: ImsSmsHandler : Message received: what = 1
I QImsService: ImsSmsImpl : onSendSmsResult:: token:4 smsResponse:{ mMessageRef = 144, mSendSmsResult = 1, mSendSmsReason = 0}
I QImsService: ImsSenderRxr : [UNSL]< UNSOL_INCOMING_IMS_SMS[SUB0]
I QImsService: ImsSmsHandler : Message received: what = 2
I QImsService: ImsSmsImpl : onSmsReceived:: token:3 incomingSms:{ mFormat = 3gpp verstat = 0}
D GsmInboundSmsHandler: Skipped message de-duping logic
I QImsService: ImsSmsImpl : acknowledgeSms:: token:3 msgRef:0 result:1
I QImsService: ImsSenderRxr : [0027]> REQUEST_ACK_IMS_SMS [SUB0]
I VvmSmsFilter: VVM SMS received
I VvmSmsReceiver: Sending SMS received event to remote service
I RemoteVvmTaskManager: Binding to ComponentInfo{com.google.android.dialer/com.android.voicemail.impl.OmtpService}
Response processed, status returned
I Dialer : VvmOmtpService - onSmsReceived
I Dialer : OmtpMessageReceiver - Received message on non-activated account
I Dialer : LegacyModeSmsHandler - processing VVM SMS on legacy mode
I Dialer : VvmActivationTask - Subscriber not ready but provisioning is not supported
I Dialer : OmtpVvmCarrierCfgHlpr - OmtpEvent:CONFIG_SERVICE_NOT_AVAILABLE
Here's where it gets fun. Checking the code.
From ActivationTask.java
Task to activate the visual voicemail service. A request to activate VVM will be sent to the carrier, which will respond with a STATUS SMS. The credentials will be updated from the SMS. If the user is not provisioned, provisioning will be attempted. Activation happens when the phone boots, the SIM is inserted, signal returned when VVM is not activated yet, and when the carrier spontaneously sent a STATUS SMS.
StatusMessage message = new StatusMessage(data);
VvmLog.d(
TAG,
"STATUS SMS received: st="
+ message.getProvisioningStatus()
+ ", rc="
+ message.getReturnCode());
if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_READY)) {
VvmLog.d(TAG, "subscriber ready, no activation required");
updateSource(getContext(), phoneAccountHandle, message, helper);
} además {
if (helper.supportsProvisioning()) {
VvmLog.i(TAG, "Subscriber not ready, start provisioning");
helper.startProvisioning(
this, phoneAccountHandle, status, message, data, isCarrierInitiated);
} else if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_NEW)) {
VvmLog.i(TAG, "Subscriber new but provisioning is not supported");
// Ignore the non-ready state and attempt to use the provided info as is.
// This is probably caused by not completing the new user tutorial.
updateSource(getContext(), phoneAccountHandle, message, helper);
} además {
VvmLog.i(TAG, "Subscriber not ready but provisioning is not supported");
helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
}
}
Bolded section is what failures are generating. That is pulled from the sms response to message.getProvisioningStatus(), which is received from the SMS status message sent by TMo vvm servers. The result should be in the first few lines:
"STATUS SMS received: st="
+ message.getProvisioningStatus()
+ ", rc="
+ message.getReturnCode());
Which will give you a result like:
I Dialer : VvmOmtpService - onSmsReceived
I Dialer : OmtpMessageReceiver - Received message on non-activated account
I Dialer : VvmActivationTask - STATUS SMS received: st=B, rc=0
(Above results are from when I had customer service remove the vvm add-on from my account. Without having vvm active on the account, the vvm service is (rightfully) setting status to Blocked.)
VvmActivationTask return comes from this section in OmtpConstants.java:
/** See {@link OmtpConstants#PROVISIONING_STATUS_VALUES} */
public static final String PROVISIONING_STATUS = "st";
/** See {@link OmtpConstants#RETURN_CODE_VALUES} */
public static final String RETURN_CODE = "rc";
A successful return would be from this list, pulled from OmtpConstants.java:
public static final String SUBSCRIBER_NEW = "N";
public static final String SUBSCRIBER_READY = "R";
public static final String SUBSCRIBER_PROVISIONED = "P";
public static final String SUBSCRIBER_UNKNOWN = "U";
public static final String SUBSCRIBER_BLOCKED = "B";
public static final String[] PROVISIONING_STATUS_VALUES = {
SUBSCRIBER_NEW,
SUBSCRIBER_READY,
SUBSCRIBER_PROVISIONED,
SUBSCRIBER_UNKNOWN,
SUBSCRIBER_BLOCKED
};
In this instance, "st" should return N, R, or P (for a working account) with a return code ("rc") in the following values: (also from OmtpConstants.java)
public static final String SUCCESS = "0";
public static final String SYSTEM_ERROR = "1";
public static final String SUBSCRIBER_ERROR = "2";
public static final String MAILBOX_UNKNOWN = "3";
public static final String VVM_NOT_ACTIVATED = "4";
public static final String VVM_NOT_PROVISIONED = "5";
public static final String VVM_CLIENT_UKNOWN = "6";
public static final String VVM_MAILBOX_NOT_INITIALIZED = "7";
public static final String[] RETURN_CODE_VALUES = {
SUCCESS,
SYSTEM_ERROR,
SUBSCRIBER_ERROR,
MAILBOX_UNKNOWN,
VVM_NOT_ACTIVATED,
VVM_NOT_PROVISIONED,
VVM_CLIENT_UKNOWN,
VVM_MAILBOX_NOT_INITIALIZED,
};
The hope here would be that it returns st=(N or R) and rc=0 for SUCCESS. (Hint: It doesn't. 😥 )
There's way more here, but this is as far as I'm going tonight.
Contenido relacionado
- Hace 2 años
- Hace 2 meses
- Hace 10 meses
- Hace 10 meses