2

我正在使用 Xamarin.Forms 和 Xamarin.Essentials 开发适用于 Android 和 iOS 的应用程序。我希望能够在我的应用程序中提供一个按钮,将用户带到设备的“设置”应用程序,然后进入我正在处理的这个应用程序的特定设置页面。

以前,这是使用依赖服务调用特定于平台的代码来完成的。我相信使用 Xamarin.Essentials Launcher(此处为 Microsoft 文档)可以更简单地完成此操作,并且无需任何特定于平台的代码。我已经想出了如何在 iOS 上做到这一点:

bool didOpenUri = await Xamarin.Essentials.Launcher.TryOpenAsync("app-settings:com.yourCompany.yourApp");

但是,我无法发现如何在 Android 上执行此操作。如果有任何不清楚的地方,请告诉我。否则,感谢任何帮助......非常感谢!

4

3 回答 3

3

据我所知,Android 设置没有 URL。启动器不支持它。

但是,设置类为设置应用程序提供了操作字符串。

设置类:https ://docs.microsoft.com/en-us/dotnet/api/android.provider.settings?view=xamarin-android-sdk-9

您可以在 Android 中执行此操作:

StartActivity(new Intent(Settings.ActionSettings));

并使用依赖服务在 Xamarin.Forms 中执行此操作。

依赖服务:https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/introduction

更新:

在 Xamarin.Forms 中:

创建接口:

 public interface IStartSetttings
 {
    void StartSettings();
 }

安卓实现:

[assembly: Dependency(typeof(StartSettings_Implementation))]
namespace XamarinDemo.Droid.DependencyService_Implementation
{
    class StartSettings_Implementation : MainActivity, IStartSetttings
    {
        public void StartSettings()
        {
            var intent = new Intent(Settings.ActionSettings);
            Forms.Context.StartActivity(intent);          

        }
    }
}

Xamarin.Forms 中的用法:

 DependencyService.Get<IStartSetttings>().StartSettings();

截屏:

在此处输入图像描述

于 2020-04-16T06:24:28.040 回答
2

@WendyZang 非常友好地提供了原始问题的答案,即很遗憾,您无法使用Xamarin.Essentials Launcher 启动Android 设置应用程序(更不用说深入了解您自己的应用程序的设置了)。

相反,您必须使用具有平台特定实现的依赖服务。为了帮助遇到同样问题的其他人,我想添加一个在 iOS 和 Android 上设置依赖服务的完整解决方案,它不仅可以导航到操作系统的设置应用程序,还可以导航到应用程序设置:

在您的跨平台项目中,界面可能如下所示。您需要传入应用的 bundle-id(例如com.myCompany.myApp):

namespace MyCoolMobileApp.Services.DependencyServices
{
    public interface ISettingsAppLauncher
    {
        void LaunchSettingsApp(string appBundleId);
    }
}

在 Android 中,您的实现可能如下所示(注意我使用的是James Montemagno 的 CurrentActivity 插件):

using System.Diagnostics;
using Android.Content;
using Plugin.CurrentActivity; // https://github.com/jamesmontemagno/CurrentActivityPlugin
using MyCoolMobileApp.Droid.Services.DependencyServices;
using MyCoolMobileApp.Services.DependencyServices;
using Xamarin.Forms;

[assembly: Dependency(typeof(SettingsAppLauncher_Android))]
namespace MyCoolMobileApp.Droid.Services.DependencyServices
{
    public class SettingsAppLauncher_Android : ISettingsAppLauncher
    {
        public void LaunchSettingsApp(string  appBundleId)
        {
            var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings);
            intent.AddFlags(ActivityFlags.NewTask);
            var uri = Android.Net.Uri.FromParts("package", appBundleId, null);
            intent.SetData(uri);
            CrossCurrentActivity.Current.AppContext.StartActivity(intent);
        }
    }
}

最后但并非最不重要的一点是,iOS 实现将是:


using System.Diagnostics;
using Foundation;
using MyCoolMobileApp.iOS.Services.DependencyServices;
using MyCoolMobileApp.Services.DependencyServices;
using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(SettingsAppLauncher_iOS))]
namespace MyCoolMobileApp.iOS.Services.DependencyServices
{
    public class SettingsAppLauncher_iOS : ISettingsAppLauncher
    {
        public void LaunchSettingsApp(string appBundleId)
        {
            var url = new NSUrl($"app-settings:{appBundleId}");
            UIApplication.SharedApplication.OpenUrl(url);
        }
    }
}
于 2020-04-22T15:53:04.350 回答
1

https://github.com/xamarin/Essentials/pull/328

AppInfo.ShowSettingsUI();

这应该使用 Xamarin Essentials 打开 iOS 和 Android 的设置

于 2022-01-24T16:18:24.277 回答