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");
所以,要么我问错了,要么不可能,让我们看看哪个...
如果我的应用程序 (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");