酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Pictures Hubに保存されているアルバムの情報を取得する

Pictures HubのCamera RollとSaved Picturesに画像を保存するに保存する方法を書いたので、Pictures Hubのアルバム情報や写真を取得する方法を紹介します。今回はアルバム情報を取得する方法です。

Pictures Hubへ写真を保存した時には、XNA Frameworkを使用しました。アルバム情報の取得や写真の取得に関しても同様にXNA Frameworkを利用します。

保存時と同様に、プロジェクトを右クリックして、メニューから[参照の追加]を選択します。参照の追加ダイアログからMicrosoft.Xna.Frameworkを選択します。

アルバム情報の取得

Microsoft.Xna.Framework.Media名前空間のMediaLibraryクラスのインスタンスを生成し、ルートアルバムにあるアルバムを取得します。取得出来るアルバムは、デバイス内に写真が格納されているオフラインアルバムと、お気に入り写真が登録されているアルバムのみです。

XAML

アルバム名を表示するListBoxコントロールをContentPanelへ配置します。

<phone:PhoneApplicationPage 
    x:Class="GetPicturesTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="SOFTBUILD" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="GetPicturesTest" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox Name="listBox1" />
        </Grid>
    </Grid>

</phone:PhoneApplicationPage>
コード(C#)

MediaLibraryクラスのインスタンスを生成して、RootPictureAlbumプロパティにてPictures Hubに登録されているアルバム群を取得します。固定で取得出来るのは以下の4アルバムです。

Pictures Hubで表示される名前 アルバム名
カメラロール Camera Roll
保存した写真 Saves Pictures
7 Sample Pictures
お気に入り Favorite Pictures

表示言語によってPictures Hubに表示される名前は変化しますが、アルバム名は同じです。スクリーンショットの通り、これらのアルバム以外にもデバイス内に存在しているアルバムを取得する事が可能です。

using System.Linq;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework.Media;

namespace GetPicturesTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) {
            // XNA Frameworkのメディアライブラリを利用する
            using (var ml = new MediaLibrary()) {
                
                // Pictures Hubに保存されているアルバムを取得する
                // ここで取得出来るアルバムは、オフライン(デバイス内の)アルバムのみ
                var albums = ml.RootPictureAlbum.Albums;
                
                // アルバムの名前を取得して、リストに表示する
                listBox1.ItemsSource = albums.Select(album => album.Name);
            }
        }
    }
}

実行してみました。

「7」アルバムの名前は上表の通り「Sample Pictures」となっています。異なる「Sample Pictures」が存在した場合は、名前が重複しますので気を付けてください。特定のアルバムを取得するのに、アルバム名だけを使用すると意外なバグを生むことになるかもしれません。

ちなみに余談ですが、この「7」アルバムは、Zune Softwareで見ると「サンプル ピクチャ」と表示されます。