在 Xamarin Forms 中的应用程序之间共享数据

Sharing data between apps in Xamarin Forms

我正在使用 Xamarin Forms 在 Android[= 中开发 2 个应用程序 AB 30=] & iOSB 需要从 A 获取一些数据(1 路通讯)。以下是注意事项:

  • 我不想从 A 打开 B(不可能有 url 方案)
  • 我已将 android:sharedUserId 设为相同
  • 我试过Xamarin.Auth,但它不会在应用程序之间共享数据
  • 我尝试了 Xam.Plugins.Settings Nuget 插件,但它没有提供接口来传递 A 的包 ID,同时从 B 获取共享首选项

我了解到可以使用相同的组 ID 在 iOS 中共享数据。 Android 除了共享 SQLite 数据库之外,还有什么方法可以共享数据吗?

是的,还有其他方法可以达到目的。


I have made android:sharedUserId same for both

如果A和B都有相同的sharedUserId,则表示A和B会运行在相同的Sandbox.

因此您的 A 和 B 可以访问彼此的“包资源”(例如项目中的 Resources 文件夹或 Raw 文件夹)和文件(例如路径:/data/data/your package name/file name


基于您所做的sharedUserId,我建议您按照以下步骤在A和B之间共享数据。

我假设您要共享的数据是应用程序 A 中的 "123"

1) 在应用程序A中,将数据写入路径为/data/data/your package name/file name的文件中。此路径不需要任何权限,因为它属于内部存储:

namespace ShareA
{
    [Activity(Label = "ShareA", MainLauncher = true)]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            WriteSettings(this, "123");
        }

        private void WriteSettings(MainActivity context, string data)
        {
            try
            {
                using (var writer = new StreamWriter(
              OpenFileOutput("settings.dat", Android.Content.FileCreationMode.Private)))
                    writer.Write(data);

                Toast.MakeText(context, "Settings saved", ToastLength.Short).Show();
            }
            catch (Exception e)
            {
                Android.Util.Log.Error("lv",e.Message);
                Toast.MakeText(context, "Settings not saved", ToastLength.Short).Show();
            }

        }
    }
}

2)在应用程序B中,从文件中读取数据:

namespace ShareB
{
    [Activity(Label = "ShareB", MainLauncher = true)]
    public class MainActivity : Activity
    {
        TextView textView;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            textView = this.FindViewById<TextView>(Resource.Id.textView1);

            try
            {
                //get A's context
                Context ctx = this.CreatePackageContext(
                        "ShareA.ShareA", Android.Content.PackageContextFlags.IgnoreSecurity);
                //Read data
                string msg = ReadSettings(ctx);
                textView.Text= msg;
                Toast.MakeText(this, "DealFile2 Settings read" + msg, ToastLength.Short).Show();
                //Or you can change the data from B
                WriteSettings(ctx, "deal file2 write");
            }
            catch (PackageManager.NameNotFoundException e)
            {
                // TODO Auto-generated catch block
                Android.Util.Log.Error("lv", e.Message);
            }
        }

        private string ReadSettings(Context context)
        {
            try
            {   // context is from A
                using (var reader = new StreamReader(context.OpenFileInput("settings.dat")))
                {
                    return reader.ReadToEnd();
                }
            }
            catch
            {
                return "";
            }
        }

        private void WriteSettings(Context context, string data)
        {
            try
            {   // context is from A
                using (var writer = new StreamWriter(
              context.OpenFileOutput("settings.dat", Android.Content.FileCreationMode.Private)))
                    writer.Write(data);

                Toast.MakeText(context, "Settings saved", ToastLength.Short).Show();
            }
            catch (Exception e)
            {
                Android.Util.Log.Error("lv", e.Message);
                Toast.MakeText(context, "Settings not saved", ToastLength.Short).Show();
            }
        }
    }
}

注:

以上代码是基于A和B都具有相同的android:sharedUserId.