Xamarin.Forms 应用程序 return 数据到调用应用程序

Xamarin.Forms App return data to calling App

所以,要么我问错了,要么不可能,让我们看看哪个...

如果我的应用程序 (Xamarin.Forms) 是从另一个应用程序启动的,为了从我的应用程序获取 url,我如何 return 将数据发送到调用应用程序?我错误地假定了 SetResult 和 Finish,我还错误地假定了 StartActivityForResult,但必须有一种方法可以做到这一点。我知道如何从另一个应用程序获取数据到我的应用程序,但在 return.

中不一样

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

所以我必须在我的 PCL 中设置一个接口,并从列表视图项目 selected 处理程序中调用方法,然后在 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 过滤器集,当您 select 将应用程序作为图像源(例如在 Facebook 上上传图像)时启动此页面。
我的问题是我不知道如何将数据(selected 图像)return 返回到发出请求的应用程序/网页。在 android 中,我了解到您会使用 StartActivityForResult 和 OnActivityResult 来处理此问题,但我使用的是 Xamarin Forms(Android、iOS、UWP)并且无法真正找到可以解决的解决方案跨平台使用。

只要 link 包含涵盖此内容的文档就很好,但如果您有示例就更好了。

谢谢

编辑

这是用于启动应用程序的代码,我有兴趣在 用户 select 之后从 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)
        {
        }
    }

您可以使用静态 public class 来保存和访问如下结果:

public static class StaticClass
{
     public static int Result;
}

您似乎无法使用远程 URI 提供给调用应用程序。我检查过的一些帖子建议将文件存储在本地并提供调用 app 的路径。为避免存储许多文件造成内存泄漏,我建议使用相同的文件名,这样您在任何时候都将只有一个文件。

再补充一点。我在 facebook 上测试了这个解决方案。 Skype 似乎不接受这一点,而且我检查过的帖子说 Skype 没有正确处理 Intent(不确定那是什么意思)。

现在开始解决。在 main activity 中,例如在 OnCreate 方法中添加以下内容。 ReturnImagePage 是我的页面 class 的名称,其中我 select 一张图片

        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();
        });

当图像 selected 时,上面将监听消息。

然后在 XFroms 代码中当图像被 selected 下载、存储、获取路径并使用它的路径发送到 Activity。下面是我的测试路径

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