Как открыть ActionCall Activity из DependencyServic в формах Xamarin? - PullRequest
0 голосов
/ 30 октября 2019

Привет, я столкнулся с очень простой проблемой, но я не совсем уверен, почему?

Я пытаюсь позвонить напрямую из приложения xamarin forms, не показывая экран dailer, пользователь увидит список своих контактов вНа экране нажмите кнопку, чтобы позвонить, и он сделает прямой вызов, не показывая экран номеронабирателя.

, чтобы добиться этого, я использовал DependencyServic, и я использовал это в качестве своей базы https://www.c -sharpcorner.com/ UploadFile / e4bad6 / code-to-start-call-in-xamarin-forms /

единственное отличие состоит в том, что это PCL, и я использую общую библиотеку

Где я нахожусьпроблема?

Мой интерфейс

public interface IPhoneCall
    {
        void MakeQuickCall(string PhoneNumber);
    }

Мой звонок в Службу зависимости

private void makeCall_Clicked(object sender, EventArgs e)
        {
            try
            {
                DependencyService.Get<IPhoneCall>().MakeQuickCall("+xxxxxxxxx");
            } catch(Exception ex)
            {
                DisplayAlert("Alert!!!", ex.Message, "ok");
            }
        }

МойВызов службы зависимости для Android:

[assembly: Dependency(typeof(PhoneCall_Droid))]
namespace MakeCall.Droid
{
    public class PhoneCall_Droid : IPhoneCall
    {
        public void MakeQuickCall(string PhoneNumber)
        {
            try
            {
                var uri = Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber));
                var intent = new Intent(Intent.ActionCall, uri);
                Xamarin.Forms.Forms.Context.StartActivity(intent);
            }
            catch (Exception ex)
            {
                new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(ex.ToString())
                .SetTitle("Android Exception")
                .Show();
            }
        }

    }
}

Это предупреждение возвращает исключение Невозможно добавить окно - нулевой токен недействителен;ваша деятельность запущена?

Я выглядела несколько таких решений, как это

Intent ActionCall не звонит по телефону в формах xamarin

и это https://forums.xamarin.com/discussion/129166/unable-to-add-window-token-null-is-not-for-an-application-alertbuilder

но я все еще не могу разобрать это,

также я пробовал это в своей Основной деятельности

internal static MainActivity Instance { get; private set; }

, а затем добавил эту строку в OnCreate метод

Instance = this;

и изменил мой метод класса обслуживания зависимостей Android на этот

public void MakeQuickCall(string PhoneNumber)
        {
            var context = MainActivity.Instance;
            try
            {

                new AlertDialog.Builder(context ).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber)).ToString())
                .SetTitle("Android Exception")
                .Show();



                Intent intent = new Intent(Intent.ActionCall, Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber)));
                context.StartActivity(intent);
            }
            catch (Exception ex)
            {
                new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
                {
                    //User pressed OK
                })
                .SetMessage(ex.ToString())
                .SetTitle("Android Exception")
                .Show();
            }
        }

и, выполнив этов сообщении отображается номер телефона, на который поступили вызовы, но он не звонит, а для части вызова все еще отображается то же, что невозможно добавить окно ..,

1 Ответ

1 голос
/ 31 октября 2019

Я могу воспроизвести вашу проблему на моей стороне, если вы запросите разрешения времени выполнения после Android 6.0, вы решите вашу проблему.

Во-первых, вы можете определить статическую переменную в MainActiviy:

 public static MainActivity macvivity;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        base.OnCreate(savedInstanceState);

        macvivity = this;    

        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);          
        LoadApplication(new App());


    }

Затем запросите разрешения перед звонком:

 public void MakeQuickCall(string PhoneNumber)
    {
        try
        {
            if (ActivityCompat.CheckSelfPermission(MainActivity.macvivity, Android.Manifest.Permission.CallPhone) != Android.Content.PM.Permission.Granted)
            {

                ActivityCompat.RequestPermissions(MainActivity.macvivity, new string[] { Android.Manifest.Permission.CallPhone }, 1);
                return;
            }
            else
            {
                var uri = Android.Net.Uri.Parse(string.Format("tel:{0}", PhoneNumber));
                var intent = new Intent(Intent.ActionCall, uri);
                Xamarin.Forms.Forms.Context.StartActivity(intent);
                //MainActivity.macvivity.StartActivity(intent);
            }               
        }
        catch (Exception ex)
        {
            new AlertDialog.Builder(Android.App.Application.Context).SetPositiveButton("OK", (sender, args) =>
            {
                //User pressed OK
            })
            .SetMessage(ex.ToString())
            .SetTitle("Android Exception")
            .Show();
        }
    }

Если мой ответ поможет вам, пожалуйста, не забудьте пометить мой ответ как ответ, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...