根據 Xamarin.Essentials 官方文件中指出:Xamarin.Essentials 跨平台應用程式開發介面的開發人員提供他們的行動應用程式。透過 Xamarin.Essentials 的套件幫忙,可以將這些功能整合到您的應用程式:加速計 應用程式資訊 電池 剪貼簿 指南針 資料傳輸 裝置顯示資訊 裝置資訊 電子郵件 檔案系統的協助程式 手電筒 地理編碼 地理位置 迴轉儀 磁力計 開啟瀏覽器 電話撥號員 喜好設定 螢幕鎖定 安全儲存體 SMS 文字轉換語音 追蹤版本 震動。
我們現在來體驗關於 Connectivity 連線 這項功能,因此,可以參考底下的專案範例,該專案範例
建立測試專案
- 首先,我們先使用 Prism Template Pack 擴充功能所提供的專案樣板,建立起一個 Xamarin.Forms 專案,在這裡我們僅選擇 Android / iOS / UWP 類型的專案;接著,我們需要把 PropertyChanged.Fody NuGet 套件安裝到 .NET Standard 專案類別庫內,並且安裝 FodyWeavers.xml 檔案。
- 緊接著,我們要開始安裝 Xamarin.Essentials NuGet 套件到所有的專案內,在這裡,請使用滑鼠右擊方案節點,選擇 管理方案的 NuGet 套件 選項
- 請在 NuGet - 解決方案 的視窗中,輸入要搜尋的套件名稱 : Xamarin.Essentials並且,請勾選 包括搶鮮版 的文字檢查盒,並且安裝這個套件;我寫這篇文章的時候, Xamarin.Essentials 的最新版本為 0.9.1-preview 版本,因此,我們安裝這個版本。
- 當 Xamarin.Essentials 套件安裝完成之後,您將會發現到在 Visual Studio 2017 的錯誤視窗中,出現了底下錯誤訊息
偵測到 Xamarin.Android.Support.Compat 的版本衝突。請直接從專案參考套件,以解決此問題。
XFEFConnectivity.Android -> XFEFConnectivity -> Xamarin.Essentials 0.9.1-preview -> Xamarin.Android.Support.CustomTabs 27.0.2 -> Xamarin.Android.Support.Compat (= 27.0.2)
XFEFConnectivity.Android -> Xamarin.Android.Support.Design 25.4.0.2 -> Xamarin.Android.Support.Compat (= 25.4.0.2).
- 現在讓我們來修正這個錯誤,在這裡,我使用了 Visual Studio Code 開啟了 Android 專案下的 .csproj 檔案,請搜尋這個關鍵字 PackageReference Include="Xamarin.Essentials"此時,您將會看到底下的內容
<ItemGroup>
<PackageReference Include="Xamarin.Essentials">
<Version>0.7.0.17-preview</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms" Version="2.5.0.122203" />
<PackageReference Include="Xamarin.Android.Support.Design" Version="25.4.0.2" />
<PackageReference Include="Xamarin.Android.Support.v7.AppCompat" Version="25.4.0.2" />
<PackageReference Include="Xamarin.Android.Support.v4" Version="25.4.0.2" />
<PackageReference Include="Xamarin.Android.Support.v7.CardView" Version="25.4.0.2" />
<PackageReference Include="Xamarin.Android.Support.v7.MediaRouter" Version="25.4.0.2" />
<PackageReference Include="Prism.Unity.Forms" Version="7.0.0.396" />
</ItemGroup>
- 我們需要將 Xamarin.Android.Support.xxx 的套件,全部都變更成從 "25.4.0.2" 到 "27.0.2.1"修改完成結果如下所示,請進行存檔該 .csproj 檔案,並且回到 Visual Studio 2017 下,此時,將會重新載入這個 Android 專案
<ItemGroup>
<PackageReference Include="Xamarin.Essentials">
<Version>0.7.0.17-preview</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms" Version="2.5.0.122203" />
<PackageReference Include="Xamarin.Android.Support.Design" Version="27.0.2.1" />
<PackageReference Include="Xamarin.Android.Support.v7.AppCompat" Version="27.0.2.1" />
<PackageReference Include="Xamarin.Android.Support.v4" Version="27.0.2.1" />
<PackageReference Include="Xamarin.Android.Support.v7.CardView" Version="27.0.2.1" />
<PackageReference Include="Xamarin.Android.Support.v7.MediaRouter" Version="27.0.2.1" />
<PackageReference Include="Prism.Unity.Forms" Version="7.0.0.396" />
</ItemGroup>
- 現在,我們需要安裝 Xamarin.Android.Support.CustomTabs 這個套件到 Android 專案下,在這個時間點,我們將會安裝最新版本的 "27.0.2.1"
- 如此,最初產生的錯誤訊息便會消失了。
- 為了要使用連線這項功能,我們需要在 Android 原生專案內設定授權具有 AccessNetworkState 權限。關於 iOS & UWP 專案,則不需要做任何的修正
- 在這裡,請打開 Android 原生專案的 MainActivity.cs 檔案
- 請在 namespace 之前,加入底下程式碼,宣告具有這使用權限
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]
- 我們將開始要進行 View ViewModel Model 的設計了,首先,我們開啟 MainPage.xaml 這個檔案,底下是我們測試的頁面 XAML 語法在這裡,我們將會增加一個按鈕,用來取得最新的螢幕裝置的顯示資訊
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XFEFConnectivity.Views.MainPage"
Title="Connectivity 連線">
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="Welcome to Xamarin Forms and Prism!" />
<Label
Text="{Binding ConnectivityStatus}"/>
<Label
Text="{Binding Profiles}"/>
</StackLayout>
</ContentPage>
- 請打開 MainPageViewModel.cs 這個檔案
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XFEFConnectivity.ViewModels
{
using System.ComponentModel;
using Prism.Events;
using Prism.Navigation;
using Prism.Services;
using Xamarin.Essentials;
public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
{
public event PropertyChangedEventHandler PropertyChanged;
public string ConnectivityStatus { get; set; }
public string Profiles { get; set; }
private readonly INavigationService _navigationService;
public MainPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
Init();
}
private void Init()
{
var current = Connectivity.NetworkAccess;
if (current == NetworkAccess.Internet)
{
ConnectivityStatus = "網際網路-本機和網際網路存取";
}
else if (current == NetworkAccess.ConstrainedInternet)
{
ConnectivityStatus = "ConstrainedInternet – 受限的網際網路存取。 指出網頁驗證入口網站的連線能力,其中提供入口網站的本機存取,但存取網際網路需要透過入口網站提供了特定的憑證。";
}
else if (current == NetworkAccess.Local)
{
ConnectivityStatus = "本機– 本機網路僅限存取。";
}
else if (current == NetworkAccess.None)
{
ConnectivityStatus = "無– 沒有連線可用。";
}
else if (current == NetworkAccess.Unknown)
{
ConnectivityStatus = "未知– 無法判定網際網路連線。";
}
var profiles = Connectivity.Profiles;
Profiles = "裝置中正在使用的連線類型 : ";
if (profiles.Contains(ConnectionProfile.WiFi))
{
Profiles += " WiFi ";
}
if (profiles.Contains(ConnectionProfile.Bluetooth))
{
Profiles += " Bluetooth ";
}
if (profiles.Contains(ConnectionProfile.Cellular))
{
Profiles += " Cellular ";
}
if (profiles.Contains(ConnectionProfile.Ethernet))
{
Profiles += " Ethernet ";
}
if (profiles.Contains(ConnectionProfile.Other))
{
Profiles += " Other ";
}
if (profiles.Contains(ConnectionProfile.WiMAX))
{
Profiles += " WiMAX ";
}
}
public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatingTo(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
}
}
}
- Android 平台執行結果這是使用 WiFi 的方式,且有連上 Internet 的執行結果這是沒有網路連線的執行結果。這是使用 4G 網路連上 Internet 的執行結果
- UWP 平台執行結果這是使用 WiFi 的方式,且有連上 Internet 的執行結果
關於 Xamarin 在台灣的學習技術資源
歡迎加入 Xamarin 實驗室 粉絲團,在這裡,將會經常性的貼出各種關於 Xamarin / Visual Studio / .NET 的相關消息、文章、技術開發等文件,讓您可以隨時掌握第一手的 Xamarin 方面消息。
歡迎加入 Xamarin.Forms @ Taiwan,這是台灣的 Xamarin User Group,若您有任何關於 Xamarin / Visual Studio / .NET 上的問題,都可以在這裡來與各方高手來進行討論、交流。
Xamarin 實驗室 部落格 是作者本身的部落格,這個部落格將會專注於 Xamarin 之跨平台 (Android / iOS / UWP) 方面的各類開技術探討、研究與分享的文章,最重要的是,它是全繁體中文。
Xamarin.Forms 系列課程 想要快速進入到 Xamarin.Forms 的開發領域,學會各種 Xamarin.Forms 跨平台開發技術,例如:MVVM、Prism、Data Binding、各種 頁面 Page / 版面配置 Layout / 控制項 Control 的用法等等,千萬不要錯過這些 Xamarin.Forms 課程