У меня есть сканер Ciperlab под управлением Windows Mobile 6 и разработка с компактным фреймворком 3.5. Мне нужно сделать телефонный звонок, и когда вызов будет завершен, вернитесь в программу, где оператор завершает транзакцию. Я использовал функцию PhoneMakeCall в phone.dll, но в результате панели требуется несколько кнопок для нажатия. Идеальное решение - скрыть всю панель телефона. Решения от любого, кто сделал это раньше, были бы очень желанными. Я знаю, что технология устарела, но я застрял в ней, как и сканер.API для PocketPC Windows Mobile 6
ответ
Для осуществления телефонного звонка необходимо использовать API телефонии (TAPI). Это API, предоставляемый MS. Для создания телефонного звонка требуется много строк кода, и может быть проще использовать обертку, такую как OpenNetCF Telephony Compact Framwork Classes. Here - пример. Примеры использования TAPI приведены на примере other.
Существует только незначительная информация о TAPI использование availabe от MS.
Некоторые производители устройств предлагают специальные телефонные SDK для поддержки устройств при доступе к телефону по коду. Например, Intermec WWAN Toolkit.
Я бы сначала пошел с openNetCF.
Спасибо за информацию josef. Это был большой
Первая ссылка ведет:
http://programmaremobile.blogspot.co.za/2009/10/how-to-make-call-with-opennetcf-tapi.html
Это имеет ссылки на OpenNetCf но здесь Wrapper (OpenNETCF.Telephony.dll) была удалена. Существует еще одна ссылка на http://tapi.codeplex.com/, которая имеет исходный код для обертки и некоторые образцы. OpenNETCF.Telephony.dll включен в zip-файл для примеров, но для этой версии требуется лицензия, а также нет всех методов, используемых образцами. Я загрузил исходный код в zip и скомпилировал его. У этого есть некоторые проблемы, но работает хорошо.
У меня есть одна проблема. Чтобы сэкономить аккумулятор, я выключаю телефон. Он должен быть включен за 30 секунд до совершения вызова, иначе система попадет в необработанные панели телефона. Нет события статуса, информирующего о том, что сеть GSM стабилизировалась и может быть выполнен вызов. На данный момент я использую таймер, но это не чистое решение.
Я приложил мой окончательный код для справки:
In Declarations
Imports OpenNETCF.Telephony
Friend WithEvents tapi As Telephony
Friend WithEvents CellLine As Line
Friend WithEvents CellCall As [Call]
Public CellPhoneCoverage As Boolean = False
Shared CellCallState As Integer = 1
Private Function CreateCellLine() As Boolean
Dim i As Integer
Dim dc As DeviceCapabilities
'Open Tapi
Try
tapi = New Telephony
tapi.Initialize()
If tapi.NumberOfDevices > 0 Then
Try
For i = 0 To tapi.NumberOfDevices - 1
tapi.GetDeviceCapabilities(i, dc)
If (dc.MediaModes And MediaMode.InteractiveVoice) = _
MediaMode.InteractiveVoice Then
'found the cellular line
CellLine = tapi.CreateLine(i, dc.MediaModes, _
CallPrivilege.None)
'To save battery turn off phone.
'Note that it must be turned on for 30 seconds
' before making a call otherwise we drop into the
' phone raw panels
NativeMethods.lineSetEquipmentState(CellLine.hLine, _
EquipmentState.Minimum)
CreateCellLine = True
'if battery is not an issue then check phone state
'Dim es As EquipmentState
'Dim rs As RadioState
'NativeMethods.lineGetEquipmentState(CellLine.hLine, es, rs)
'CreateCellLine = (es = EquipmentState.Full And rs = RadioState.On)
Exit Function
End If
Next
MsgBox("cell line not found")
CreateCellLine = False
Catch ex As Exception
CreateCellLine = False
MsgBox("CreateCellLine(1):" & ex.Message)
End Try
End If
Catch ex As Exception
CreateCellLine = False
MsgBox("CreateCellLine(2):" & ex.Message)
End Try
End Function
Handle events:
Private Sub CellCall_CallState(ByVal [call] As OpenNETCF.Telephony.Call, _
ByVal state As OpenNETCF.Telephony.CallState) _
Handles CellCall.CallState
'Note that this state change is not called for disconencted and connected events
MsgBox("Call state is " & state.ToString())
End Sub
Private Sub CellCall_Connected(ByVal [call] As OpenNETCF.Telephony.Call, _
ByVal state As OpenNETCF.Telephony.CallState) _
Handles CellCall.Connected
MsgBox("Connected")
End Sub
Private Sub CellCall_Disconnected(ByVal [call] As OpenNETCF.Telephony.Call, _
ByVal state As OpenNETCF.Telephony.CallState) _
ByVal disconnectMode As OpenNETCF.Telephony.DisconnectMode) _
Handles CellCall.Disconnected
MsgBox("Disconnected")
End Sub
In the form_load procedure:
'Open Tapi and check we have cell phone coverage
CellPhoneCoverage = CreateCellLine()
To make a call:
'If the phone if off then it must be turned on for 30 seconds
' before making a call otherwise we drop into the phone raw panels
Dim rc As Integer
Dim es As EquipmentState
Dim rs As RadioState
NativeMethods.lineGetEquipmentState(CellLine.hLine, es, rs)
If Not (es = EquipmentState.Full) Then
rc = NativeMethods.lineSetEquipmentState(CellLine.hLine, EquipmentState.Full)
Else
If (es = EquipmentState.Full And rs = RadioState.On) Then
CellCall = CellLine.MakeCall("0812500163", 27, False)
End If
End If
To end a call:
CellCall.Hangup()
If Not ((CellCallState = OpenNETCF.Telephony.CallState.Idle) Or _
(CellCallState = OpenNETCF.Telephony.CallState.Disconnected)) Then
'must do check otherwise get a null exception
Try
CellCall.Hangup()
Catch ex As Exception
MsgBox("CellCall.Hangup: " & ex.Message)
End Try
End If
'if battery is not an issue then leave phone on
' remember when making a call allow time for the network to connect
' otherwise we drop into the phone raw panels
NativeMethods.lineSetEquipmentState(CellLine.hLine, _
EquipmentState.Minimum)