I'm having some troubles with location, i've followed one signal document but as you can see in the SS, location point still null
And here is some code (following the order, MainActivity.cs in .Android and App.cs in PCL)
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
PullToRefreshLayoutRenderer.Init();
OneSignal.Current.StartInit("onesignalID").EndInit();
OneSignal.Current.PromptLocation();
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
App.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
public App()
{
InitializeComponent();
var config = RealmConfiguration.DefaultConfiguration;
config.SchemaVersion = 1;
OneSignal.Current.StartInit("onesignalID").InFocusDisplaying(OSInFocusDisplayOption.None).HandleNotificationReceived(HandleNotificationReceived).HandleNotificationOpened(HandleNotificationOpened).EndInit();
OneSignal.Current.PromptLocation();
MainPage = new MainPage();
}
protected override void OnStart()
{
OneSignal.Current.RegisterForPushNotifications();
// Handle when your app starts
}
The location request is prompting in app init as expected but even if i allow location sharing, location point in onesignal still null
Related
in MainActivity.cs I send the following message:
resultIntent.PutExtra("message", "string123");
then in App.css i am trying to accept the message as follows:
Intent.Extras.GetString("message", "");
but the path I'm using is for MainActivity.cs...
It seems like you want to pass a message from MainActivity to App when the App constructor is first created. This you can achieve in a number of ways
Option 1 (Recommended)
Simply by giving a parameter to App constructor as follows
public App(string message)
{
InitializeComponent();
MainPage = new AppShell(message);
}
This you can set from MainActivity on creation as follows
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App("string123"));
}
Option 2
Yet another option, which i would not prefer, could be to pass an instance of MainActivity to App as follows
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
this.Intent.PutExtra("message", "string1234");
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App(this));
}
then in App constructor you use this instance as follows
Android.App.Activity _mainActivity;
public App(object mainActivity)
{
InitializeComponent();
string message = "Void";
if (Device.RuntimePlatform == Device.Android)
{
_mainActivity = (Android.App.Activity)mainActivity;
message = _mainActivity.Intent.Extras.GetString("message", "");
}
MainPage = new AppShell(message);
}
I am following the guide here however when I attempt to launch the notification in Xamarin forms Andriod, I get the following.
https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/local-notifications
INotificationManager notificationManager;
int notificationNumber = 0;
notificationManager = DependencyService.Get<INotificationManager>();
notificationManager.NotificationReceived += (sender, eventArgs) =>
{
var evtData = (NotificationEventArgs)eventArgs;
ShowNotification(evtData.Title, evtData.Message);
};
void ShowNotification(string title, string message)
{
Device.BeginInvokeOnMainThread(() =>
{
var msg = new Label()
{
Text = $"Notification Received:\nTitle: {title}\nMessage: {message}"
};
stacklayout.Children.Add(msg);
});
}
My Main Activity
[Activity(Label = "THEHOCKEYLAB", Icon = "#mipmap/icon", Theme = "#style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize, LaunchMode = LaunchMode.SingleTop )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CreateNotificationFromIntent(Intent);
Window.SetStatusBarColor(Android.Graphics.Color.Black); //here
}
protected override void OnNewIntent(Intent intent)
{
CreateNotificationFromIntent(intent);
}
void CreateNotificationFromIntent(Intent intent)
{
if (intent?.Extras != null)
{
string title = intent.GetStringExtra(AndroidNotificationManager.TitleKey);
string message = intent.GetStringExtra(AndroidNotificationManager.MessageKey);
DependencyService.Get<INotificationManager>().ReceiveNotification(title, message);
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
public interface INotificationManager
{
event EventHandler NotificationReceived;
void Initialize();
void SendNotification(string title, string message, DateTime? notifyTime = null);
void ReceiveNotification(string title, string message);
}
I get the following error.
System.NullReferenceException: 'Object reference not set to an
instance of an object.'
But I have had a look and cant find anything on it am using Xamarin forms version 5.0.0.2083
Its on this line am recieving the error.
notificationManager.NotificationReceived += (sender, eventArgs) =>
{
var evtData = (NotificationEventArgs)eventArgs;
ShowNotification(evtData.Title, evtData.Message);
};
Never mind I found my answer Credit to this SO. Like all Dependency's it must be registered or will always be null.
Android notification null pointer exception. This needs to be in ur main activity.cs.
DependencyService.Register<INotificationManager, AndroidNotificationManager>();
I have two activities: MainActivity and Activity2:
public class MainActivity : AppCompatActivity
{
DateTime time = DateTime.Now;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
var button = FindViewById<Button>(Resource.Id.button);
button.Text = "Button created at " + time.ToString();
button.Click += (s, e) =>
{
Intent intent = new Intent(this, typeof(Activity2));
StartActivity(intent);
};
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
and:
[Activity(Label = "Activity2")]
public class Activity2 : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity2);
Button button_close = FindViewById<Button>(Resource.Id.button_close);
button_close.Click += (s, e) =>
{
Intent intent = new Intent(this, typeof(MainActivity));
StartActivity(intent);
};
}
}
Clicking on button opens Activity2 and hides MainActivity. button_close closes Activity2 and opens a new instance of MainActivity. But I do not want a new instance to be created. How can I revive exactly the original previously-created instance of MainActivity and return to it after Activity2 is closed?
Here, button.Text shows whether a new instance of MainActivity is created.
Just call Finish() on Activity2, it will return to the previous.
If you want to pass some kind of result, you can use StartActivityForResult and in OnActivityResult get the resulting data.
I have a small issue with Scheduled Notification on Android - Xamarin Forms Project. I want to schedule a daily notification at 17:00. It works ok on simulator but when I deploy it on a Samsung S7 Edge - Android 8.0, it notifies me at 17:00 and after I open the notification, it will keep notify every minute or so.
Here is my code, MainActivity.cs:
[Activity(Label = "SpiritMobile", Icon = "#mipmap/icon", Theme = "#style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
static readonly string CHANNEL_ID = "location_notification";
internal static readonly string COUNT_KEY = "count";
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CreateNotificationChannel();
Intent alarmIntent = new Intent(this, typeof(AlarmReceiver));
PendingIntent pending = PendingIntent.GetBroadcast(this, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
AlarmManager alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
var calendar = Calendar.Instance;
calendar.TimeZone = Java.Util.TimeZone.GetTimeZone("Europe/Bucharest");
calendar.Set(CalendarField.HourOfDay, 17);
calendar.Set(CalendarField.Minute, 00);
alarmManager.SetRepeating(AlarmType.RtcWakeup, calendar.TimeInMillis, AlarmManager.IntervalDay, pending);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
ServicePointManager.ServerCertificateValidationCallback += (o, cert, chain, errors) => true;
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
void CreateNotificationChannel()
{
if (Build.VERSION.SdkInt < BuildVersionCodes.O)
{
return;
}
var channel = new NotificationChannel(CHANNEL_ID, "reminders", NotificationImportance.Default)
{
Description = "reminder's channel"
};
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.CreateNotificationChannel(channel);
}
}
Then I have AlarmReceiver.cs:
[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var message = "Don't forget to submit your daily rates.";
Intent backIntent = new Intent(context, typeof(MainActivity));
backIntent.SetFlags(ActivityFlags.NewTask);
var resultIntent = new Intent(context, typeof(MainActivity));
PendingIntent pending = PendingIntent.GetActivities(context, 0,
new Intent[] { backIntent, resultIntent },
PendingIntentFlags.OneShot);
var builder = new NotificationCompat.Builder(context, "location_notification")
.SetAutoCancel(true)
.SetContentTitle("Submit your daily feeling!")
.SetContentText(message)
.SetSmallIcon(Resource.Drawable.icon);
builder.SetContentIntent(pending);
var notificationManager = NotificationManagerCompat.From(context);
notificationManager.Notify(1000, builder.Build());
}
}
Could you please tell me what is wrong here? What can be the cause of this?
You are setting your repeating alarm in OnCreate method of the Activity. So every time app is launched, a new alarm is registered with the AlarmManager. As it is repeating alarm you need to set it only once.
It can be achieved by checking if your alarm is already set.
Exception Unhandled.
System.TypeLoadException: Could not resolve type with token 01000115
(from typeref, class/assembly
Xamarin.Forms.Xaml.XamlResourceIdAttribute, Xamarin.Forms.Core,
Code:
protected override void OnCreate(Bundle bundle) {
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
It occurs on the line global::Xamarin.Forms.Forms.Init(this, bundle)