You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:47:06