Я новичок в мобильной разработке и в Xamarin.
Я создал новое решение Xamarin.Forms «AndroidApp1», которое по умолчанию состоит из двух проектов: «AndroidApp1.Android» и «AndroidApp1».
Если я правильно понял то, что прочитал, первый содержит код, специфичный для Android, а второй - код, который можно использовать в Android, iOS или Windows Phone.
Мое решение работает в режиме эмуляции Android в режиме отладки, теперь я хотел бы получать уведомление о входящем звонке, я хотел бы получить номер телефона, который мне звонит.
Google сказал мне, что мне нужно создать класс, унаследованный от BroadcastReceiver, и переопределить функцию OnReceive.
Я предполагаю, что этот класс должен находиться в конкретном проекте Android (AndroidApp1.Android), поэтому я создал класс здесь, но что теперь? Я не могу найти информации о том, что делать с этим классом? Где мне его создать? Как мне получить уведомление и номер телефона для ответа в моем проекте "AndroidApp1"?
Вот исходный код моего BroadcastReceiver (скопирован из Интернета):
[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "android.intent.action.PHONE_STATE" })]
public class IncomingCallReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
// ensure there is information
if (intent.Extras != null)
{
// get the incoming call state
string state = intent.GetStringExtra(TelephonyManager.ExtraState);
// check the current state
if (state == TelephonyManager.ExtraStateRinging)
{
// read the incoming call telephone number...
string telephone = intent.GetStringExtra(TelephonyManager.ExtraIncomingNumber);
// check the reade telephone
if (string.IsNullOrEmpty(telephone))
telephone = string.Empty;
}
else if (state == TelephonyManager.ExtraStateOffhook)
{
// incoming call answer
}
else if (state == TelephonyManager.ExtraStateIdle)
{
// incoming call end
}
}
}
}
Вам необходимо зарегистрировать широковещательный приемник для состояния вызова.
<action android:name = "android.intent.action.PHONE_STATE" />
<action android:name = "android.intent.action.NEW_OUTGOING_CALL" />
и создайте уведомление, как только получите события трансляции.
Убедитесь, что вы определили разрешение.
<uses-permission android:name = "android.permission.READ_PHONE_STATE"/>
Вам необходимо зарегистрировать приемник в файле Android Manifest. Примерно так <Receiver android: name = ". PhoneStateReceiver"> <intent-filter> <action android: name = "android.intent.action.PHONE_STATE" /> </intent-filter> </receiver>
Вам понадобится Broadcast Receiver примерно так.
/**
* Listener to detect incoming calls.
*/
private class CallStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// called when someone is ringing to this phone
Toast.makeText(ctx, "Incoming: "+incomingNumber,
Toast.LENGTH_LONG).show();
break;
}
}
You can register the lister for incoming call events.
tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);
Here is the more info
https://stackoverflow.com/questions/9684866/how-to-detect-when-phone-is-answered-or-rejected
Наконец-то я на шаг впереди. Я создал класс StateListener, который наследуется от PhoneStateListener в конкретном проекте Android, например:
public class StateListener : PhoneStateListener
{
public override void OnCallStateChanged(CallState state, string incomingNumber)
{
base.OnCallStateChanged(state, incomingNumber);
switch (state)
{
case CallState.Ringing:
break;
case CallState.Offhook:
break;
case CallState.Idle:
break;
}
}
}
Затем я создал экземпляр этого класса в функции OnCreate класса MainActivity конкретного проекта Android с помощью следующих трех строк кода:
StateListener phoneStateListener = new StateListener();
TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);
telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);
Теперь, когда я устанавливаю точки останова в case части switch (state) в OnCallStateChanged, они ломаются, но incomingNumber всегда пуст, хотя я установил соответствующие права в манифесте.
Итак, это будет мой следующий шаг, чтобы получить номер вызывающего абонента.
Не могли бы вы объяснить немного подробнее? Где (в каком файле, в каком проекте) зарегистрировать tie broadcastreveiver? Где (в каком файле, в каком проекте) мне запрашивать разрешения? Что мне делать с моим классом
IncomingCallReceiverпосле его регистрации? Где мне его создать? Как мне получить информацию из классаIncomingCallReceiver, что есть входящий звонок? Реализую ли я в нем события?