Xamarin.Forms App将数据返回给App

时间:2017-07-06 09:36:36

标签: xamarin xamarin.ios xamarin.forms xamarin.uwp

所以,要么我提出错误,要么不可能,让我们看看......

如果我的应用程序(Xamarin.Forms)是从其他应用程序启动的,为了从我的应用程序获取网址,我该如何将该数据返回到调用应用程序?我错误地假设了SetResult和Finish,我也错误地假设了StartActivityForResult,但必须有一种方法可以做到这一点。我知道如何从其他应用程序获取数据到我的应用程序,但回报不一样。

可能的部分解决方案 - 更新,失败

所以我必须在我的PCL中设置一个接口,并从listview项目中选择处理程序调用该方法,在Android应用程序中我可以这样做:

Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_url"));
setResult(Activity.RESULT_OK, result);
finish();

(来源:https://developer.android.com/training/basics/intents/filters.html

这看起来是否正确,我将如何在iOS上实现相同的功能?

结束

我删除了之前的问题,因为我无法清楚地解释问题,所以这里就是这样。

我有一个Xamarin Forms应用程序,我想将此应用程序的一部分用作图库。目前我有一个列表中显示的图像,我有一个Intent过滤器集,当您选择应用程序作为图像的来源(例如在Facebook上传图像)时启动此页面。
我的问题是我不知道如何将数据(所选图像)返回到发出请求的应用程序/网页。在android我明白你会使用StartActivityForResult和OnActivityResult来处理这个问题,但是我使用的是Xamarin Forms(Android,iOS,UWP)并且无法真正找到可以跨平台使用的解决方案。

只是指向文档的链接会很好,但如果你有一个例子,那就更好了。

由于

修改

以下是用于启动应用的代码,我有兴趣从 Intent.ActionPick中获取数据用户从 ListView 中选择了一个图片,它位于PCL的 ContentPage 中。

[Activity(Label = "", Icon = "@drawable/icon", Theme = "@style/DefaultTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop,
          ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
[IntentFilter(new[] { Intent.ActionSend }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = @"*/*")]
[IntentFilter(new[] { Intent.ActionView, Intent.ActionPick, Intent.ActionGetContent }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryOpenable }, DataMimeType = @"*/*")]
public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        try
        {
            base.OnCreate(bundle);

            CurrentPlatform.Init();
            Xamarin.Forms.Forms.Init(this, bundle);

            App _app = new App();
            LoadApplication(_app);

            if (Intent.Action == Intent.ActionSend)
            {
                var image = Intent.ClipData.GetItemAt(0);
                var imageStream = ContentResolver.OpenInputStream(image.Uri);
                var memOfImage = new System.IO.MemoryStream();
                imageStream.CopyTo(memOfImage);
                _app.UploadManager(memOfImage.ToArray());  //This allows me to upload images to my app
            }
            else if (Intent.Action == Intent.ActionPick)
            {
                _app.SelectManager(); //here is where I need help
            }
            else
            {
                _app.AuthManager(); //this is the default route
            }
        }
        catch (Exception e)
        {
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以使用静态公共类来保存和访问结果,如:

public static class StaticClass
{
     public static int Result;
}

答案 1 :(得分:1)

似乎你不能使用远程URI来提供给调用app。我检查的一些帖子建议在本地存储文件并提供它调用应用程序的路径。为了避免存储许多文件导致内存泄漏,我建议使用相同的文件名,然后您随时只能有一个文件。

还有一点需要注意。我在facebook上测试了这个解决方案。 Skype似乎不接受这一点,而且,我检查过的帖子说Skype没有正确处理Intent(不确定这意味着什么)。

现在要解决。在主要活动中,例如在OnCreate方法中添加以下内容。 ReturnImagePage是我选择图像的页面类的名称

        Xamarin.Forms.MessagingCenter.Subscribe<ReturnImagePage, string>(this, "imageUri", (sender, requestedUri) => {

            Intent share = new Intent();
            string uri = "file://" + requestedUri;
            share.SetData(Android.Net.Uri.Parse(uri));

            // OR
            //Android.Net.Uri uri = Android.Net.Uri.Parse(requestedUri);
            //Intent share = new Intent(Intent.ActionSend);
            //share.PutExtra(Intent.ExtraStream, uri);
            //share.SetType("image/*");
            //share.AddFlags(ActivityFlags.GrantReadUriPermission);

            SetResult(Result.Ok, share);
            Finish();
        });

上面将在选择图像时收听消息。

然后在XFroms代码中选择图像时下载它,存储它,获取路径并使用它的路径发送到Activity。以下是我的测试路径

MessagingCenter.Send<ReturnImagePage, string>(this, "imageUri", "/storage/emulated/0/Android/data/ButtonRendererDemo.Droid/files/Pictures/temp/IMG_20170207_174559_21.jpg");