我正在研究xamarin.forms。(仅在android中遇到以下问题)
当我的应用程序启动时,它会检查我的GPS位置是打开还是关闭。
要打开或关闭GPS位置,我正在使用依赖服务。
public static bool CheckGPSConnection()
{
var gpsConnection = DependencyService.Get<IGPSConnectivity>();
return gpsConnection.CheckGPSConnection();
}
当我来到我的应用程序的主页时,我把下面的代码
if (Device.OS == TargetPlatform.Android)
{
if (!App.CheckGPSConnection())
{
bool answer = await DisplayAlert("Alert", "Would you like to start GPS?", "Yes", "No");
if (answer)
{
Android.App.Application.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings));
}
}
}
但它给了我一个例外
{Android.Util.AndroidRuntimeException:从中调用startActivity() 在Activity上下文之外需要FLAG_ACTIVITY_NEW_TASK 旗。这真的是你想要的吗?在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [Users / ...}中的[0x0000c]
我该怎么办?
答案 0 :(得分:7)
这是特定于平台的功能,因此您应该为它创建一个DependencyService。
就像IGPSConnectivity
创建另一个界面一样。例如ISettingsService
。
public interface ISettingsService
{
void OpenSettings();
}
然后在Android上,按照以下方式实现:
public class SettingsServiceAndroid : ISettingsService
{
public void OpenSettings()
{
Xamarin.Forms.Forms.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings));
}
}
现在再次使用您的共享PCL代码进行呼叫,就像使用GPS连接一样。
DependencyService.Get<ISettingsService>().OpenSettings();
因为您正在使用DependencyService,所以将注入每个平台的正确实现。所以,没有必要使用if (Device.OS == TargetPlatform.Android)
行,除非你出于其他原因这样做。另外,我认为这种方法现在是deprecated。您现在应该使用Xamarin.Forms 2.3.4。{/ p>中的Device.RuntimePlatform == Device.Android
答案 1 :(得分:0)
在Android中,我使用它(使用DependencyServices调用)来打开设置
public void View(){
LocationManager locationManager = (LocationManager)Forms.Context.GetSystemService(Context.LocationService);
if (locationManager.IsProviderEnabled(LocationManager.GpsProvider) == false)
{
Intent gpsSettingIntent = new Intent(Settings.ActionLocationSourceSettings);
Forms.Context.StartActivity(gpsSettingIntent);
}
}