在 Xamarin Forms 中的应用程序之间共享数据
Sharing data between apps in Xamarin Forms
我正在使用 Xamarin Forms 在 Android[= 中开发 2 个应用程序 A 和 B 30=] & iOS 和 B 需要从 A 获取一些数据(1 路通讯)。以下是注意事项:
- 我不想从 A 打开 B(不可能有 url 方案)
- 我已将 android:sharedUserId 设为相同
- 我试过Xamarin.Auth,但它不会在应用程序之间共享数据
- 我尝试了 Xam.Plugins.Settings Nuget 插件,但它没有提供接口来传递 A 的包 ID,同时从 B 获取共享首选项
我了解到可以使用相同的组 ID 在 iOS 中共享数据。 Android 除了共享 SQLite 数据库之外,还有什么方法可以共享数据吗?
是的,还有其他方法可以达到目的。
ContentProvider:仅当您需要在多个应用程序之间共享数据时才需要内容提供程序
Building Apps with Content Sharing: 有教程可以参考
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
.
我正在使用 Xamarin Forms 在 Android[= 中开发 2 个应用程序 A 和 B 30=] & iOS 和 B 需要从 A 获取一些数据(1 路通讯)。以下是注意事项:
- 我不想从 A 打开 B(不可能有 url 方案)
- 我已将 android:sharedUserId 设为相同
- 我试过Xamarin.Auth,但它不会在应用程序之间共享数据
- 我尝试了 Xam.Plugins.Settings Nuget 插件,但它没有提供接口来传递 A 的包 ID,同时从 B 获取共享首选项
我了解到可以使用相同的组 ID 在 iOS 中共享数据。 Android 除了共享 SQLite 数据库之外,还有什么方法可以共享数据吗?
是的,还有其他方法可以达到目的。
ContentProvider:仅当您需要在多个应用程序之间共享数据时才需要内容提供程序
Building Apps with Content Sharing: 有教程可以参考
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
.