MAUI安卓应用接收其他应用JSON文件闪退问题求助
解决MAUI安卓接收分享JSON文件闪退问题
问题分析
你的应用能被列为分享目标但选中后闪退,核心原因包括:
- 重复配置Intent Filter(Manifest和代码注解双重定义,引发Manifest解析冲突)
- 自定义Activity处理完Intent后未正确维持生命周期,直接退出导致空白闪退
- Intent数据获取逻辑不完整(仅处理
ClipData,未覆盖主流的EXTRA_STREAM分享方式)
修复步骤
1. 清理重复配置
删除AndroidManifest.xml中手动添加的DataFileIntentActivity节点,MAUI会通过代码中的[Activity]和[IntentFilter]注解自动生成对应Manifest配置,重复配置会引发异常。
2. 修改自定义Activity逻辑
调整DataFileIntentActivity.cs,确保处理完分享数据后正确启动主应用,避免空白界面残留:
namespace KitCare { [Activity(Name = "KitCare.DataFileIntentActivity", Exported = true)] [IntentFilter( new[] { Android.Content.Intent.ActionSend }, Categories = new[] { Android.Content.Intent.CategoryDefault }, DataMimeType = "application/json")] public class DataFileIntentActivity : MauiAppCompatActivity { protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); Platform.Init(this, savedInstanceState); // 处理当前分享Intent HandleShareIntent(Intent); // 启动主应用并传递数据 LaunchMainApp(); // 结束当前Activity,消除空白界面 Finish(); } private void HandleShareIntent(Intent? intent) { if (intent?.Action != Intent.ActionSend) return; Stream? inputStream = null; try { // 兼容两种分享数据传递方式 Android.Net.Uri? fileUri = null; if (intent.ClipData != null && intent.ClipData.ItemCount > 0) { fileUri = intent.ClipData.GetItemAt(0).Uri; } else if (intent.HasExtra(Intent.ExtraStream)) { fileUri = intent.GetParcelableExtra<Android.Net.Uri>(Intent.ExtraStream); } if (fileUri != null) { inputStream = ContentResolver.OpenInputStream(fileUri); if (inputStream != null) { using var reader = new StreamReader(inputStream); var jsonContent = reader.ReadToEnd(); // 临时保存数据到Preferences,供主应用读取 Preferences.Set("SharedJson", jsonContent); } } } catch (Exception ex) { // 捕获异常避免闪退 Console.WriteLine($"处理分享文件失败: {ex.Message}"); } finally { inputStream?.Dispose(); } } private void LaunchMainApp() { var mainIntent = PackageManager.GetLaunchIntentForPackage(PackageName); if (mainIntent != null) { // 确保启动已有主Activity实例,避免重复打开 mainIntent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop); StartActivity(mainIntent); } } } }
3. 在MAUI主应用中读取分享数据
在App.xaml.cs的OnResume方法中读取保存的分享数据:
protected override void OnResume() { base.OnResume(); if (Preferences.ContainsKey("SharedJson")) { var jsonContent = Preferences.Get("SharedJson", string.Empty); if (!string.IsNullOrEmpty(jsonContent)) { // 这里处理JSON内容 Console.WriteLine("收到分享的JSON内容: " + jsonContent); // 处理完成后清除临时数据 Preferences.Remove("SharedJson"); } } }
4. 可选:直接在MainActivity中处理分享
如果不需要自定义Activity,可直接修改MainActivity.cs,添加IntentFilter并处理分享:
namespace KitCare { [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] [IntentFilter( new[] { Android.Content.Intent.ActionSend }, Categories = new[] { Android.Content.Intent.CategoryDefault }, DataMimeType = "application/json")] public class MainActivity : MauiAppCompatActivity { protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); Platform.Init(this, savedInstanceState); // 处理启动时的分享Intent HandleShareIntent(Intent); } protected override void OnNewIntent(Intent? intent) { base.OnNewIntent(intent); // 处理应用运行时的分享Intent HandleShareIntent(intent); } private void HandleShareIntent(Intent? intent) { // 复用上面的HandleShareIntent逻辑即可 } } }
关键注意事项
- 必须兼容
EXTRA_STREAM:多数应用分享文件时会通过该字段传递Uri,而非ClipData - 全局捕获异常:避免因文件权限、读取错误等导致应用闪退
- 合理管理Activity生命周期:处理完数据后及时启动主应用或结束当前Activity
内容的提问来源于stack exchange,提问作者scegg
相关产品推荐
相关产品推荐

