LoginSignup
3
3

More than 3 years have passed since last update.

眺めて覚える C# Xamarin Forms(13) File 操作

Posted at

Android上の任意のファイルアクセスするときにユーザーの許可が必要です。

主なAndroidのファイルディレクトリ

Android.OS.Environment ディレクトリ
DirectoryAlarms PRIVATE_EXTERNAL_STORAGE/Alarms
DirectoryDcim PRIVATE_EXTERNAL_STORAGE/DCIM
DirectoryDownloads PRIVATE_EXTERNAL_STORAGE/Download
DirectoryDocuments PRIVATE_EXTERNAL_STORAGE/Documents
DirectoryMovies PRIVATE_EXTERNAL_STORAGE/Movies
DirectoryMusic PRIVATE_EXTERNAL_STORAGE/Music
DirectoryNotifications PRIVATE_EXTERNAL_STORAGE/Notifications
DirectoryPodcasts PRIVATE_EXTERNAL_STORAGE/Podcasts
DirectoryRingtones PRIVATE_EXTERNAL_STORAGE/Ringtones
DirectoryPictures PRIVATE_EXTERNAL_STORAGE/Pictures

image.png

許可なしでアクセスすると下記のメッセージを出し例外として扱われます。

image.png

手順1 Xamarin formsのプロジェクトを作成します。

手順2 andoridプロジェクトのプロパティを開きます。

image.png

手順3 ファイルアクセスするためには、android マニフェストを開いて、必要なアクセス許可を与えます。

image.png
image.png
AndroidManifest.xmlにて確認します。
image.png

手順4 参照にMono.Abdroid.dllを追加します。

image.png

手順5MainActivity.csに許可ダイアログ要求を追加します。

MainActivity.cs
using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Support.V4.App;
using Android.Support.V4.Content;
using Android;

namespace PCLFiles.Droid
{
    [Activity(Label = "PCLFiles", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);
       //追加します。
            if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != (int)Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 0);
            }
            if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, 0);
            }


            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

image.png

手順6 MainPage.xamlにスタートボタンを設定します。

MainPage.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"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="PCLFiles.MainPage">

    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Welcome to Xamarin.Forms!" 
           HorizontalOptions="Center"
            />
        <Button Text="Start" Clicked="SetUp"/>
    </StackLayout>
</ContentPage>

手順7 ライブラリを追加しMainPage.xaml.csにファイル読み込み部を追加します。

image.png

MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

using Android.OS;
using System.IO;
using Android.Support.V4.App;
using Android.Support.V4.Content;
using Android;
namespace PCLFiles
{
    public class Cam
    {
        public string Name { get; set; }
        public string Image { get; set; }
    }
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

        }

        private void SetUp(object s,EventArgs e)
        {
            var tmp = new DataTemplate(() =>
            {
                var grid = new Grid() { Margin = 2 };
                grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(100) });
                grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) });
                var name = new Label { FontSize = 16 };
                name.SetBinding(Label.TextProperty, "Name");
                var image = new Image() { HeightRequest = 200 };
                image.SetBinding(Image.SourceProperty, "Image");
                grid.Children.Add(image, 0, 0);
                grid.Children.Add(name, 1, 0);
                return new ViewCell { View = grid };
            });
            var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim).Path + "/Camera";
            var lst = from x in Directory.GetFiles(path).Take(10) select new Cam() { Name = Path.GetFileName(x), Image = x };
            var lv = new ListView() { ItemsSource = lst, ItemTemplate = tmp };
            Content = new Xamarin.Forms.ScrollView() { Margin = 2, Orientation = ScrollOrientation.Vertical, Content = lv };
        }
    }
}

手順8 実行する。

image.png

付録

nugetで追加したライブラリ

image.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3