In this blog post, you will learn how to Search images using Bing Search API using Cognitive Service in Xamarin forms.
- Xamarin.Forms - Bing Web Search Using Cognitive Service
- Xamarin.Forms - Bing Video Search Using Cognitive Service
Introduction
Xamarin.Forms code runs on multiple platforms - each of which has its own filesystem. This means that reading and writing files is most easily done using the native file APIs on each platform. Alternatively, embedded resources are a simpler solution to distribute data files with an app.
Cognitive Services
Xamarin and Cognitive Services together can infuse your apps, websites, and bots with intelligent algorithms to see, hear, speak, understand and interpret your user needs through natural methods of communication. Also, they help you transform your business with AI today.
Use AI to solve business problems
- Vision
- Speech
- Knowledge
- Search
- Language
- Bing Image Search API provides an experience similar to Bing Images.
- Bing Image Search API lets you send a search query to Bing and get back a list of relevant images from the Bing Image Search API.
- Visual Studio 2017 or Later(Windows or Mac)
- Bing Search API Key
Start by creating a new Xamarin.Forms project. You’ll learn more by going through the steps yourself.
Visual Studio 2019 has more options in the opening window. Clone or check out the code from any repository or, open a project or solution for your computer.
Now, you need to click "Create a new project".
Now, filter by Project Type: Mobile
Choose the Mobile App (Xamarin. forms) project under C# and Mobile.
Name your app. You probably want your project and solution to use the same name as your app. Put it on your preferred location for projects and click "Create".
Now, select the blank app and target platforms - Android, iOS and Windows (UWP).
Subsequently, go to the solution. In there, you get all the files and sources of your project (.NET Standard). Now, select XAML page and double-click to open the MainPage.Xaml page.
You now have a basic Xamarin.Forms app. Click the Play button to try it out.
Get Bing Search API Key
In this step, get Bing Search API Key. Go to the following link.
https://azure.microsoft.com/en-in/services/cognitive-services/
Click "Try Cognitive Services for free".
Now, you can choose Bing Search APIs under Search APIs. Afterward, click "Get API Key".
Read the terms, and select your country/region. Afterward, click "Next".
Now, log in using your preferred account.
Now, the API key is activated. You can use it now.
Note
The trial key is available only for 7 days.
Setting up the User Interface
Go to MainPage.Xaml and write the following code.
MainPage.xaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8" ?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:XamarinCognitive" | |
x:Class="XamarinCognitive.MainPage"> | |
<StackLayout> | |
<StackLayout> | |
<StackLayout HorizontalOptions="Center" VerticalOptions="Start"> | |
<Image x:Name="imgBanner" Source="banner.png" ></Image> | |
<Image Margin="0,0,0,10" x:Name="imgCognitive" HeightRequest="100" Source="cognitiveservice.png" ></Image> | |
<Label Margin="0,0,0,10" Text="Bing Image Search" FontAttributes="Bold" FontSize="Large" TextColor="Gray" HorizontalTextAlignment="Center" ></Label> | |
<Entry x:Name="txtSearch" Placeholder="Type here.."></Entry> | |
<Button x:Name="btnSearch" WidthRequest="50" Text="Search" Clicked="BtnSearch_Clicked" /> | |
<ScrollView> | |
<Grid> | |
<Grid.ColumnDefinitions> | |
<ColumnDefinition Width="*"/> | |
<ColumnDefinition Width="*"/> | |
</Grid.ColumnDefinitions> | |
<Grid.RowDefinitions> | |
<RowDefinition Height="100"/> | |
<RowDefinition Height="100"/> | |
<RowDefinition Height="100"/> | |
</Grid.RowDefinitions> | |
<Image Grid.Row="0" Grid.Column="0" x:Name="img1"></Image> | |
<Image Grid.Row="0" Grid.Column="1" x:Name="img2"></Image> | |
<Image Grid.Row="1" Grid.Column="0" x:Name="img3"></Image> | |
<Image Grid.Row="1" Grid.Column="1" x:Name="img4"></Image> | |
<Image Grid.Row="2" Grid.Column="0" x:Name="img5"></Image> | |
<Image Grid.Row="2" Grid.Column="1" x:Name="img6"></Image> | |
</Grid> | |
</ScrollView> | |
</StackLayout> | |
</StackLayout> | |
</StackLayout> | |
</ContentPage> |
NuGet Packages
Now, add the following NuGet Packages.
- Newtonsoft.Json
Go to Solution Explorer and select your solution. Right-click and select "Manage NuGet Packages for Solution". Search "Newtonsoft.Json" and add Package. Remember to install it for each project (.NET Standard, Android, iO, and UWP).
Create a Model
In this step, you can create a model for Deserializing your response.
ResponseModel.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Text; | |
namespace XamarinCognitive | |
{ | |
public class ResponseModel | |
{ | |
public string _type { get; set; } | |
public Instrumentation instrumentation { get; set; } | |
public string readLink { get; set; } | |
public string webSearchUrl { get; set; } | |
public QueryContext queryContext { get; set; } | |
public int totalEstimatedMatches { get; set; } | |
public int nextOffset { get; set; } | |
public List<Value> value { get; set; } | |
public List<QueryExpansion> queryExpansions { get; set; } | |
public List<PivotSuggestion> pivotSuggestions { get; set; } | |
public List<RelatedSearch> relatedSearches { get; set; } | |
} | |
public class Instrumentation | |
{ | |
public string _type { get; set; } | |
} | |
public class QueryContext | |
{ | |
public string originalQuery { get; set; } | |
public string alterationDisplayQuery { get; set; } | |
public string alterationOverrideQuery { get; set; } | |
public string alterationMethod { get; set; } | |
public string alterationType { get; set; } | |
} | |
public class Thumbnail | |
{ | |
public int width { get; set; } | |
public int height { get; set; } | |
} | |
public class BestRepresentativeQuery | |
{ | |
public string text { get; set; } | |
public string displayText { get; set; } | |
public string webSearchUrl { get; set; } | |
} | |
public class InsightsMetadata | |
{ | |
public int recipeSourcesCount { get; set; } | |
public BestRepresentativeQuery bestRepresentativeQuery { get; set; } | |
public int pagesIncludingCount { get; set; } | |
public int availableSizesCount { get; set; } | |
} | |
public class Value | |
{ | |
public string webSearchUrl { get; set; } | |
public string name { get; set; } | |
public string thumbnailUrl { get; set; } | |
public DateTime datePublished { get; set; } | |
public string contentUrl { get; set; } | |
public string hostPageUrl { get; set; } | |
public string contentSize { get; set; } | |
public string encodingFormat { get; set; } | |
public string hostPageDisplayUrl { get; set; } | |
public int width { get; set; } | |
public int height { get; set; } | |
public Thumbnail thumbnail { get; set; } | |
public string imageInsightsToken { get; set; } | |
public InsightsMetadata insightsMetadata { get; set; } | |
public string imageId { get; set; } | |
public string accentColor { get; set; } | |
} | |
public class Thumbnail2 | |
{ | |
public string thumbnailUrl { get; set; } | |
} | |
public class QueryExpansion | |
{ | |
public string text { get; set; } | |
public string displayText { get; set; } | |
public string webSearchUrl { get; set; } | |
public string searchLink { get; set; } | |
public Thumbnail2 thumbnail { get; set; } | |
} | |
public class Thumbnail3 | |
{ | |
public string thumbnailUrl { get; set; } | |
} | |
public class Suggestion | |
{ | |
public string text { get; set; } | |
public string displayText { get; set; } | |
public string webSearchUrl { get; set; } | |
public string searchLink { get; set; } | |
public Thumbnail3 thumbnail { get; set; } | |
} | |
public class PivotSuggestion | |
{ | |
public string pivot { get; set; } | |
public List<Suggestion> suggestions { get; set; } | |
} | |
public class Thumbnail4 | |
{ | |
public string thumbnailUrl { get; set; } | |
} | |
public class RelatedSearch | |
{ | |
public string text { get; set; } | |
public string displayText { get; set; } | |
public string webSearchUrl { get; set; } | |
public string searchLink { get; set; } | |
public Thumbnail4 thumbnail { get; set; } | |
} | |
} |
In this step, write the following code for Bing Image Search.
MainPage.xaml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Threading.Tasks; | |
using Xamarin.Forms; | |
using Newtonsoft.Json; | |
namespace XamarinCognitive | |
{ | |
public partial class MainPage : ContentPage | |
{ | |
public static string APIKey = "a30148ca5fc74a47b4e49b554fc4f683"; | |
public static string baseURl = "https://api.cognitive.microsoft.com/bing/v7.0/images/search"; | |
struct SearchResult | |
{ | |
public String jsonResult; | |
public Dictionary<String, String> relevantHeaders; | |
} | |
List<Images> imageList = new List<Images>(); | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
private void BtnSearch_Clicked(object sender, EventArgs e) | |
{ | |
SearchResult bingResult = BingImageSearch(txtSearch.Text); | |
var res = JsonConvert.DeserializeObject<ResponseModel>(bingResult.jsonResult); | |
for (int i = 0; i < res.value.Count; i++) | |
{ | |
imageList.Add(new Images { ImagePath = res.value[i].contentUrl }); | |
} | |
img1.Source = ImageSource.FromUri(new Uri(imageList[0].ImagePath)); | |
img2.Source = ImageSource.FromUri(new Uri(imageList[1].ImagePath)); | |
img3.Source = ImageSource.FromUri(new Uri(imageList[2].ImagePath)); | |
img4.Source = ImageSource.FromUri(new Uri(imageList[3].ImagePath)); | |
img5.Source = ImageSource.FromUri(new Uri(imageList[4].ImagePath)); | |
img6.Source = ImageSource.FromUri(new Uri(imageList[5].ImagePath)); | |
} | |
//Bing Image Search | |
static SearchResult BingImageSearch(string searchQuery) | |
{ | |
var uriQuery = baseURl + "?q=" + Uri.EscapeDataString(searchQuery); | |
WebRequest request = HttpWebRequest.Create(uriQuery); | |
request.Headers["Ocp-Apim-Subscription-Key"] = APIKey; | |
HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result; | |
string json = new StreamReader(response.GetResponseStream()).ReadToEnd(); | |
var searchResult = new SearchResult(); | |
searchResult.jsonResult = json; | |
searchResult.relevantHeaders = new Dictionary<String, String>(); | |
foreach (String header in response.Headers) | |
{ | |
if (header.StartsWith("BingAPIs-") || header.StartsWith("X-MSEdge-")) | |
searchResult.relevantHeaders[header] = response.Headers[header]; | |
} | |
return searchResult; | |
} | |
} | |
public class Images | |
{ | |
public string ImagePath { get; set; } | |
} | |
} |
Web Result
I hope you have understood how to Search images using Bing Search API using Cognitive Service Bing Search API in Xamarin.Forms.
Thanks for reading. Please share comments and feedback. Happy Coding 😄
Thanks for sharing this informative content , Great work
ReplyDeleteLeanpitch provides online training in Scrum Master during this lockdown period everyone can use it wisely.
CSM Certification online
Thanks for sharing this informative content , Great work
ReplyDeleteLeanpitch provides online training in Advanced Scrum Master during this lockdown period everyone can use it wisely.
Advanced CSM training online