Xamarin Android-имя вызывающего абонента - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу синхронизировать некоторые контактные данные из нашего бэкэнда с телефоном с помощью приложения.Нам не разрешается сохранять эти контакты на телефоне (из-за конфиденциальности).Мы можем сохранить данные внутри нашего приложения.Но проблема здесь в том, что когда кто-то звонит мне, я вижу номер, но не имя моего контакта.

Есть ли способ сообщить системе, что я знаю, что число "1234" зависит от имени«Майкл» (например).Если мы сохраним эти данные на телефоне или предоставим их через ContentProvider, другие приложения смогут получать данные и сохранять / отправлять их куда угодно ...

Я создал тестовое приложение, которое включает BroadcastReceiver, которыйпрослушивает событие / действие Phone-State.Когда звонит телефон, я могу получить номер, проверить свою внутреннюю базу данных и показать имя в тосте / активности / уведомлении.Я также знаю о возможности создания полного "экрана вызова" самостоятельно, но это не то, что я хочу.

Было бы более удобно, если имя появляется на стандартном родном экране вызывающего абонента вместонеизвестное число.

Есть ли способ добиться этого?

Вот мой BroadcastReceiver

[BroadcastReceiver(Name= "myapp.PhoneStateReceiver", Enabled = true, Exported = true)]
[IntentFilter(new[] { "android.intent.action.PHONE_STATE" })]
public class PhoneStateBroadcastReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        var state = intent.GetStringExtra(TelephonyManager.ExtraState);
        var incomingNumber = intent.GetStringExtra(TelephonyManager.ExtraIncomingNumber);

        if (state == TelephonyManager.ExtraStateRinging && !string.IsNullOrEmpty(incomingNumber))
        {
            ShowActivity(context, incomingNumber);
        }
        else if (state == TelephonyManager.ExtraStateIdle)
        {
            if (CrossCurrentActivity.Current.Activity is IncomingCallActivity)
            {
                CrossCurrentActivity.Current.Activity.Finish();
            }
        }
    }


    private static void ShowActivity(Context context, string number)
    {
        Task.Delay(200).ContinueWith(t =>
        {
            var i = new Intent(context, typeof(IncomingCallActivity));
            i.PutExtra("incomingnumber", number);
            i.AddFlags(ActivityFlags.NewTask);
            i.AddFlags(ActivityFlags.SingleTop);

            context.StartActivity(i);
        });
    }

}
...