在我的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();
}
}
答案 0 :(得分:0)
当用户完成选择文件以便我的程序知道成功或取消时,是否可以对此活动进行任何接收OK状态结果?
不,您无法在此活动中执行任何操作即可获得“正常”状态。您的应用已成功启动目标应用的活动,但目标应用的活动根本没有设置结果。因此,除非您可以修改目标应用程序的代码,否则您将无法获得正常状态。
通常,我们只使用StartActivity
和Intent.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)
选择过程完成后,将通知已完成事件的订阅者,并可执行后续操作。
缺点是没有办法确定用户是否成功取消或完成了目标操作,但这可以解决。