Laden...

Forenbeiträge von devdave Ingesamt 4 Beiträge

23.02.2023 - 07:42 Uhr

Ich muss mit der 2. App lediglich einen eingebauten RFID Scanner ansteuern und den eingescannten Tag an die Hauptapp schicken

22.02.2023 - 20:43 Uhr

Hallo,

ich habe 2 Apps zu schreiben. App1 in Xamarin.Android und App2 in Xamarin.Forms. App2 ist nur für das Scannen eines RFID-Tags und müssen nicht aktiv sein. Wenn also App1 aktiv ist, möchte ich App2 anweisen, den RFID-Scan zu starten und das Ergebnis an App1 zu übermitteln.

Meine bisherigen Recherchen haben folgendes ergeben:

Nachrichten von App zu App mit dem Broadcast-Empfänger.

Ich habe es bisher versucht, allerdings ist es mir bisher nur gelungen, eine Nachricht an mich selbst zu senden
Da App2 nicht aktiv sein darf und im Hintergrund arbeiten soll, habe ich mir überlegt, einen Dienst zu nutzen. Ist es möglich, einen Dienst zu verwenden?

Allerdings muss ich den Scanvorgang in App2 irgendwie von App1 aus starten, was ich auch mit einer Broadcast-Nachricht realisieren würde.

Wie bringe ich eine inaktive App dazu, mit App1 zu kommunizieren?

Wenn App2 ausgeschaltet ist, muss ich auch in der Lage sein, sie zu starten, ohne dass sie aktiv wird, sondern in einer Art Leerlaufmodus wartet.

Ich weiß, das sind eine Menge Fragen, aber ich muss das alles bis Freitag fertig haben....

Danke

22.02.2023 - 20:41 Uhr

Problem gelöst.
Habs über den DependencyService gelöst.


[assembly: Xamarin.Forms.Dependency(typeof(MainActivity))]
namespace RFID_App.Droid
{
    [Activity(Label = "RFID_App", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IBroadcastService
    {
        
        
        private IntentFilter intentFilter = new IntentFilter("eu.logfox.ReceiverMDE");
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            
            StartService();

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        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 void sendDMC()
        {
            try
            {
                string dmcCode = "]<!n4lkj3n4j3n4lj3n4kj3n4l3k4nk3j4nlkj34nklj3";

                Intent intent = new Intent();
                intent.SetAction("eu.logfox.ReceiverMDE");
                intent.PutExtra("DMC_CODE", dmcCode);
                Context context = Android.App.Application.Context;
                context.SendBroadcast(intent);



            }
            catch(Exception ex)
            {
                System.Console.WriteLine(ex.Message);
            }
        }
    }
}

im forms Bereich


namespace RFID_App
{
    public interface IBroadcastService
    {
        void sendDMC();
    }
}

und in der xaml.cs file:


namespace RFID_App
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void onBtnClick(object sender, EventArgs e)
        {
            try {
                Xamarin.Forms.DependencyService.Get<IBroadcastService>().sendDMC();
            } catch(Exception ex) {
                System.Console.WriteLine(ex.Message);
            };
        }
    }
}

20.02.2023 - 10:54 Uhr

Guten Morgen.
Ich habe folgendes Problem: In meiner Xamarin:Forms App hab ich in der MainActivity einen BroadcastReceiver eingebaut, mit allem was dazugehört.


namespace AppCommunication.Droid
{
    [Activity(Label = "AppCommunication", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static MainActivity MainActivityInstance { get; private set; }
        Receiver rec;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            MainActivityInstance = this;
            rec = new Receiver();
            LoadApplication(new App());
        }
        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 void sendBroadcastMessage()
        {
            if (rec != null)
            {
                SendBroadcast(new Intent("com.xamarin.example.TEST"));
            }
            else
            {
                return;
            }
        }

        protected override void OnResume()
        {
            base.OnResume();
            RegisterReceiver(rec, new IntentFilter("com.xamarin.example.TEST"));
        }

        protected override void OnPause()
        {
            UnregisterReceiver(rec);
            base.OnPause();
        }
    }
}

Mein BroadcastReceiver:


namespace AppCommunication.Droid
{
    [BroadcastReceiver]
    public class Receiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        }
    }
}

Meine XAML Datei:


<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AppCommunication.MainPage">

    <StackLayout>
        <Button Text="START"
                Clicked="OnStartButtonClicked">
        </Button>
    </StackLayout>

</ContentPage>

Dazugehörige xaml.cs Datei


namespace AppCommunication
{
    public partial class MainPage : ContentPage
    {
        
        public MainPage()
        {
            InitializeComponent();
        }

        private void OnStartButtonClicked(object sender, EventArgs e)
        {
            //Do something
        }
    }
}

Ich möchte bzw. muss in der OnStartButtonClicked Methode meiner xaml.cs Datei die SendBroadcast() Methode aus der MainActivity aufrufen.
Wie man im Code der MainActivity sehen kann habe ich es bereits mit einem statischen MainActivity Objekt versucht aber auch so ist die MainActivity im xaml.cs Bereich nicht sichtbar.
Geh ich da ganz falsch ran oder seh ich den Wald vor lauter Bäumen nicht

Danke im Vorraus