Anonymous
Я использую adb для звонка, но он заканчивается через 2-3 секунды.
Сообщение
Anonymous » 05 июл 2024, 12:36
На самом деле я создаю приложение для вызова телефонного номера с компьютера.
Я использую adb для отправки команды на Android, но когда я отправляю команду с терминала, она работает хорошо, однако когда я использую приложение, я завершил вызов через несколько секунд
вот код, в котором я думаю, проблема
Код: Выделить всё
private async Task CallPhoneNumbersAsync()
{
try
{
var selectedPhones = lbConnectedPhones.SelectedItems.Cast
().ToList();
var phoneQueue = new Queue(phoneNumbers);
var callTasks = new List();
foreach (var phone in selectedPhones)
{
callTasks.Add(Task.Run(() => HandlePhoneCallsAsync(phone, phoneQueue)));
}
await Task.WhenAll(callTasks); // Attend que tous les appels soient terminés
}
catch (Exception ex)
{
MessageBox.Show($"Error making calls: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private async Task HandlePhoneCallsAsync(Phone phone, Queue phoneQueue)
{
while (phoneQueue.Count > 0 && !stopCalls)
{
PhoneNumber phoneNumber;
lock (phoneQueue)
{
if (phoneQueue.Count == 0)
break;
phoneNumber = phoneQueue.Dequeue();
}
dgPhoneNumbers.Dispatcher.Invoke(() =>
{
dgPhoneNumbers.SelectedItem = phoneNumber;
phoneNumber.CallStart = $"Début de l'appel : {DateTime.Now:HH:mm:ss}";
phoneNumber.CallingPhoneName = phone.Name;
phoneNumber.CallStatus = "En cours";
UpdatePhoneNumberDisplay(phoneNumber);
});
bool callSucceeded = await MakeCallAsync(phoneNumber.PrimaryNumber, phone.Name);
if (!callSucceeded && !string.IsNullOrEmpty(phoneNumber.SecondaryNumber))
{
callSucceeded = await MakeCallAsync(phoneNumber.SecondaryNumber, phone.Name);
}
dgPhoneNumbers.Dispatcher.Invoke(() =>
{
phoneNumber.CallEnd = $"Fin de l'appel : {DateTime.Now:HH:mm:ss}";
phoneNumber.CallStatus = callSucceeded ? "Terminé" : "Numéro inexistant";
UpdatePhoneNumberDisplay(phoneNumber);
});
await Task.Delay(5000); // Simulate a delay between calls
}
if (stopCalls)
{
MessageBox.Show("Calls stopped by user.", "Calls Stopped", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
private async Task MakeCallAsync(string number, string phone)
{
try
{
if (string.IsNullOrEmpty(number))
{
return false;
}
if (phone.Contains("Android"))
{
await MakeCallAndroidAsync(number, phone);
}
else if (phone.Contains("iOS"))
{
LaunchPhoneCall(number);
}
else
{
MessageBox.Show($"Unknown phone type for {phone}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
return true;
}
catch (Exception ex)
{
MessageBox.Show($"Error making call to {number} on {phone}: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return false;
}
}
private void LogMessage(string message)
{
string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "call_logs.txt");
string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}{Environment.NewLine}";
File.AppendAllText(logFilePath, logMessage);
}
private Task MakeCallAndroidAsync(string number, string device)
{
return Task.Run(async () =>
{
try
{
Process process = new Process();
process.StartInfo.FileName = AdbPath;
process.StartInfo.Arguments = $"-s {device.Substring(device.IndexOf(' ') + 1)} shell am start -a android.intent.action.CALL -d tel:{number.Replace(" ", "")}";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
string result = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (!string.IsNullOrEmpty(error))
{
LogMessage($"Error starting call: {error}");
MessageBox.Show($"Error: {error}", "Call Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
LogMessage($"Call started: {result}");
MessageBox.Show($"Call result: {result}", "Call Result", MessageBoxButton.OK, MessageBoxImage.Information);
}
bool isCallActive = true;
while (isCallActive)
{
await Task.Delay(2000);
Process checkCallProcess = new Process();
checkCallProcess.StartInfo.FileName = AdbPath;
checkCallProcess.StartInfo.Arguments = $"-s {device.Substring(device.IndexOf(' ') + 1)} shell dumpsys telecom";
checkCallProcess.StartInfo.RedirectStandardOutput = true;
checkCallProcess.StartInfo.UseShellExecute = false;
checkCallProcess.StartInfo.CreateNoWindow = true;
checkCallProcess.Start();
string callStatus = checkCallProcess.StandardOutput.ReadToEnd();
checkCallProcess.WaitForExit();
LogMessage($"Call status: {callStatus}");
if (!callStatus.Contains("CallActivity"))
{
isCallActive = false;
LogMessage("Call ended");
}
}
}
catch (Exception ex)
{
LogMessage($"Exception during call: {ex.Message}");
MessageBox.Show($"Error making Android call: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
});
}
Надеюсь, кто-нибудь сможет мне помочь. Извините, если информации недостаточно, не стесняйтесь спрашивать, нужна ли вам еще часть кода.
Подробнее здесь:
https://stackoverflow.com/questions/787 ... -3-seconds
1720172198
Anonymous
На самом деле я создаю приложение для вызова телефонного номера с компьютера. Я использую adb для отправки команды на Android, но когда я отправляю команду с терминала, она работает хорошо, однако когда я использую приложение, я завершил вызов через несколько секунд вот код, в котором я думаю, проблема [code]private async Task CallPhoneNumbersAsync() { try { var selectedPhones = lbConnectedPhones.SelectedItems.Cast ().ToList(); var phoneQueue = new Queue(phoneNumbers); var callTasks = new List(); foreach (var phone in selectedPhones) { callTasks.Add(Task.Run(() => HandlePhoneCallsAsync(phone, phoneQueue))); } await Task.WhenAll(callTasks); // Attend que tous les appels soient terminés } catch (Exception ex) { MessageBox.Show($"Error making calls: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } private async Task HandlePhoneCallsAsync(Phone phone, Queue phoneQueue) { while (phoneQueue.Count > 0 && !stopCalls) { PhoneNumber phoneNumber; lock (phoneQueue) { if (phoneQueue.Count == 0) break; phoneNumber = phoneQueue.Dequeue(); } dgPhoneNumbers.Dispatcher.Invoke(() => { dgPhoneNumbers.SelectedItem = phoneNumber; phoneNumber.CallStart = $"Début de l'appel : {DateTime.Now:HH:mm:ss}"; phoneNumber.CallingPhoneName = phone.Name; phoneNumber.CallStatus = "En cours"; UpdatePhoneNumberDisplay(phoneNumber); }); bool callSucceeded = await MakeCallAsync(phoneNumber.PrimaryNumber, phone.Name); if (!callSucceeded && !string.IsNullOrEmpty(phoneNumber.SecondaryNumber)) { callSucceeded = await MakeCallAsync(phoneNumber.SecondaryNumber, phone.Name); } dgPhoneNumbers.Dispatcher.Invoke(() => { phoneNumber.CallEnd = $"Fin de l'appel : {DateTime.Now:HH:mm:ss}"; phoneNumber.CallStatus = callSucceeded ? "Terminé" : "Numéro inexistant"; UpdatePhoneNumberDisplay(phoneNumber); }); await Task.Delay(5000); // Simulate a delay between calls } if (stopCalls) { MessageBox.Show("Calls stopped by user.", "Calls Stopped", MessageBoxButton.OK, MessageBoxImage.Information); } } private async Task MakeCallAsync(string number, string phone) { try { if (string.IsNullOrEmpty(number)) { return false; } if (phone.Contains("Android")) { await MakeCallAndroidAsync(number, phone); } else if (phone.Contains("iOS")) { LaunchPhoneCall(number); } else { MessageBox.Show($"Unknown phone type for {phone}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return false; } return true; } catch (Exception ex) { MessageBox.Show($"Error making call to {number} on {phone}: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return false; } } private void LogMessage(string message) { string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "call_logs.txt"); string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}{Environment.NewLine}"; File.AppendAllText(logFilePath, logMessage); } private Task MakeCallAndroidAsync(string number, string device) { return Task.Run(async () => { try { Process process = new Process(); process.StartInfo.FileName = AdbPath; process.StartInfo.Arguments = $"-s {device.Substring(device.IndexOf(' ') + 1)} shell am start -a android.intent.action.CALL -d tel:{number.Replace(" ", "")}"; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.Start(); string result = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (!string.IsNullOrEmpty(error)) { LogMessage($"Error starting call: {error}"); MessageBox.Show($"Error: {error}", "Call Error", MessageBoxButton.OK, MessageBoxImage.Error); } else { LogMessage($"Call started: {result}"); MessageBox.Show($"Call result: {result}", "Call Result", MessageBoxButton.OK, MessageBoxImage.Information); } bool isCallActive = true; while (isCallActive) { await Task.Delay(2000); Process checkCallProcess = new Process(); checkCallProcess.StartInfo.FileName = AdbPath; checkCallProcess.StartInfo.Arguments = $"-s {device.Substring(device.IndexOf(' ') + 1)} shell dumpsys telecom"; checkCallProcess.StartInfo.RedirectStandardOutput = true; checkCallProcess.StartInfo.UseShellExecute = false; checkCallProcess.StartInfo.CreateNoWindow = true; checkCallProcess.Start(); string callStatus = checkCallProcess.StandardOutput.ReadToEnd(); checkCallProcess.WaitForExit(); LogMessage($"Call status: {callStatus}"); if (!callStatus.Contains("CallActivity")) { isCallActive = false; LogMessage("Call ended"); } } } catch (Exception ex) { LogMessage($"Exception during call: {ex.Message}"); MessageBox.Show($"Error making Android call: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }); } [/code] Надеюсь, кто-нибудь сможет мне помочь. Извините, если информации недостаточно, не стесняйтесь спрашивать, нужна ли вам еще часть кода. Подробнее здесь: [url]https://stackoverflow.com/questions/78710723/im-using-adb-to-make-a-phone-call-but-its-ending-after-2-3-seconds[/url]