Ich habe einen Ciperlab-Scanner, der Windows Mobile 6 ausführt und mit Compact Framework 3.5 entwickelt. Ich muss einen Anruf tätigen und nach Abschluss des Anrufs zu dem Programm zurückkehren, in dem der Bediener die Transaktion abschließt. Ich habe die Funktion PhoneMakeCall in der phone.dll verwendet, aber das resultierende Panel erfordert eine Anzahl von Tasten, die gedrückt werden müssen. Die perfekte Lösung wäre, das gesamte Telefonfenster zu verstecken. Lösungen von allen, die dies bereits getan haben, wären sehr willkommen. Ich weiß, dass die Technologie alt ist, aber ich bin davon abhängig, wie es mit dem Scanner kommt.API zu PocketPC Windows Mobile 6
Antwort
Um einen Anruf zu tätigen, muss die Telefonie-API (TAPI) verwendet werden. Dies ist eine API, die von MS bereitgestellt wird. Das Tätigen eines Anrufs erfordert viele Codezeilen und es ist möglicherweise einfacher, einen Wrapper wie OpenNetCF Telephony Compact Framwork Classes zu verwenden. Here ist ein Beispiel. Es gibt other Beispiele für die Verwendung von TAPI.
Es gibt nur wenige Informationen über TAPI Verwendung verfügbar von MS.
Einige Gerätehersteller bieten spezielle Phone SDKs an, die den Zugriff von Geräten auf das Telefon über Code unterstützen. Zum Beispiel das Intermec WWAN Toolkit.
Ich würde zuerst mit openNetCF gehen.
Danke für info josef. Es war toll,
Der erste Link führt Sie zu:
http://programmaremobile.blogspot.co.za/2009/10/how-to-make-call-with-opennetcf-tapi.html
Dies hat Links zu OpenNETCF aber hier ist die Wrapper (OpenNETCF.Telephony.dll) entfernt wurde. Es gibt einen weiteren Link zu http://tapi.codeplex.com/, der den Quellcode für den Wrapper und einige Beispiele enthält. Die OpenNETCF.Telephony.dll ist in der ZIP-Datei für die Beispiele enthalten, aber diese Version benötigt eine Lizenz und verfügt nicht über alle Methoden, die von den Beispielen verwendet werden. Ich habe den komprimierten Quellcode heruntergeladen und kompiliert. Es hat einige Probleme, funktioniert aber gut.
Ich habe ein ausstehendes Problem. Um Batterie zu sparen, schalte ich das Telefon aus. Es muss 30 Sekunden vor dem Anruf eingeschaltet werden, andernfalls wird das System in die Raw-Panels des Telefons verschoben. Es gibt kein Statusereignis, das darüber informiert, dass sich das GSM-Netzwerk stabilisiert hat und ein Anruf getätigt werden kann. Im Moment benutze ich einen Timer, aber das ist keine saubere Lösung.
Ich habe meinen letzten Code als Referenz beigefügt:
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)