如何在Intent.ActionSend

时间:2018-03-16 00:20:44

标签: android android-intent xamarin.android

在我的Xamarin Android应用程序中,我一直致力于创建一项活动,允许用户将文件共享到另一个程序(即电子邮件,OneDrive,Google Drive等)。它正在工作,但它会立即执行并返回,并取消状态。然后打开一个漂亮的菜单,询问用户使用哪个应用程序,最终成功保存文件。

当用户完成选择文件以便我的程序知道成功或取消时,是否可以对此活动进行任何接收OK状态结果?

我的活动:

public class FileShareActivity : Activity
{
    public static EventHandler<bool> Completed;

    protected override void OnCreate(Bundle savedInstanceState) {
        base.OnCreate(savedInstanceState);

        string sourceFilePath = Intent.GetStringExtra("sourceFilePath");

        try {
            var file = new Java.IO.File(sourceFilePath);
            var fileUri = FileProvider.GetUriForFile(Application.Context, fileProviderAuthority, file);
            if ( fileUri != null ) {
                var shareIntent = new Intent(Intent.ActionSend);
                shareIntent.PutExtra(Intent.ExtraStream, fileUri);
                shareIntent.SetDataAndType(fileUri, Application.Context.ContentResolver.GetType(fileUri));
                shareIntent.SetFlags(ActivityFlags.GrantReadUriPermission);
                shareIntent.SetFlags(ActivityFlags.NewTask);

                StartActivityForResult(shareIntent, 0);
            }
        } catch ( Exception ex ) {
            Services.ExceptionService.Instance.HandleException(ex);
        }
    }

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) {
        base.OnActivityResult(requestCode, resultCode, data);
        Completed?.Invoke(null, resultCode != Result.Canceled);
        Finish();
    }
}

2 个答案:

答案 0 :(得分:0)

  

当用户完成选择文件以便我的程序知道成功或取消时,是否可以对此活动进行任何接收OK状态结果?

不,您无法在此活动中执行任何操作即可获得“正常”状态。您的应用已成功启动目标应用的活动,但目标应用的活动根本没有设置结果。因此,除非您可以修改目标应用程序的代码,否则您将无法获得正常状态。

通常,我们只使用StartActivityIntent.ActionSend

答案 1 :(得分:0)

经过几个小时的研究后,我在Android开发人员指南(https://developer.android.com/training/sharing/send.html)中找到了解决方案。

  

...如果你调用Intent.createChooser(),将它传递给你的Intent对象,它会返回你的意图版本,它将始终显示[a]选择器。

因此可以通过将调用更改为:

来实现异步
StartActivityForResult(Intent.CreateChooser(shareIntent, "Share file"), 0)

选择器完成后执行OnActivityResult覆盖。虽然resultCode仍然返回取消,但如果用户从选择器中取消,则data参数为null,否则是包含所使用的选择器名称的意图(所使用的目标应用程序的名称)。这可以通过将行更改为

来确定选择器的成功
Completed?.Invoke(null, data != null)

选择过程完成后,将通知已完成事件的订阅者,并可执行后续操作。

缺点是没有办法确定用户是否成功取消或完成了目标操作,但这可以解决。