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 |
許可なしでアクセスすると下記のメッセージを出し例外として扱われます。
手順1 Xamarin formsのプロジェクトを作成します。
手順2 andoridプロジェクトのプロパティを開きます。
手順3 ファイルアクセスするためには、android マニフェストを開いて、必要なアクセス許可を与えます。
手順4 参照にMono.Abdroid.dllを追加します。
手順5MainActivity.csに許可ダイアログ要求を追加します。
MainActivity.cs
usingSystem;usingAndroid.App;usingAndroid.Content.PM;usingAndroid.Runtime;usingAndroid.Views;usingAndroid.Widget;usingAndroid.OS;usingAndroid.Support.V4.App;usingAndroid.Support.V4.Content;usingAndroid;namespacePCLFiles.Droid{[Activity(Label="PCLFiles",Icon="@mipmap/icon",Theme="@style/MainTheme",MainLauncher=true,ConfigurationChanges=ConfigChanges.ScreenSize|ConfigChanges.Orientation)]publicclassMainActivity:global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity{protectedoverridevoidOnCreate(BundlesavedInstanceState){TabLayoutResource=Resource.Layout.Tabbar;ToolbarResource=Resource.Layout.Toolbar;base.OnCreate(savedInstanceState); //追加します。if(ContextCompat.CheckSelfPermission(this,Manifest.Permission.ReadExternalStorage)!=(int)Permission.Granted){ActivityCompat.RequestPermissions(this,newstring[]{Manifest.Permission.ReadExternalStorage},0);}if(ContextCompat.CheckSelfPermission(this,Manifest.Permission.WriteExternalStorage)!=(int)Permission.Granted){ActivityCompat.RequestPermissions(this,newstring[]{Manifest.Permission.WriteExternalStorage},0);}Xamarin.Essentials.Platform.Init(this,savedInstanceState);global::Xamarin.Forms.Forms.Init(this,savedInstanceState);LoadApplication(newApp());}publicoverridevoidOnRequestPermissionsResult(intrequestCode,string[]permissions,[GeneratedEnum]Android.Content.PM.Permission[]grantResults){Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);base.OnRequestPermissionsResult(requestCode,permissions,grantResults);}}}
手順6 MainPage.xamlにスタートボタンを設定します。
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?><ContentPagexmlns="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 --><LabelText="Welcome to Xamarin.Forms!"HorizontalOptions="Center"/><ButtonText="Start"Clicked="SetUp"/></StackLayout></ContentPage>
手順7 ライブラリを追加しMainPage.xaml.csにファイル読み込み部を追加します。
MainPage.xaml.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingXamarin.Forms;usingAndroid.OS;usingSystem.IO;usingAndroid.Support.V4.App;usingAndroid.Support.V4.Content;usingAndroid;namespacePCLFiles{publicclassCam{publicstringName{get;set;}publicstringImage{get;set;}}// Learn more about making custom code visible in the Xamarin.Forms previewer// by visiting https://aka.ms/xamarinforms-previewer[DesignTimeVisible(false)]publicpartialclassMainPage:ContentPage{publicMainPage(){InitializeComponent();}privatevoidSetUp(objects,EventArgse){vartmp=newDataTemplate(()=>{vargrid=newGrid(){Margin=2};grid.ColumnDefinitions.Add(newColumnDefinition{Width=newGridLength(100)});grid.ColumnDefinitions.Add(newColumnDefinition{Width=newGridLength(1,GridUnitType.Auto)});varname=newLabel{FontSize=16};name.SetBinding(Label.TextProperty,"Name");varimage=newImage(){HeightRequest=200};image.SetBinding(Image.SourceProperty,"Image");grid.Children.Add(image,0,0);grid.Children.Add(name,1,0);returnnewViewCell{View=grid};});varpath=Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim).Path+"/Camera";varlst=fromxinDirectory.GetFiles(path).Take(10)selectnewCam(){Name=Path.GetFileName(x),Image=x};varlv=newListView(){ItemsSource=lst,ItemTemplate=tmp};Content=newXamarin.Forms.ScrollView(){Margin=2,Orientation=ScrollOrientation.Vertical,Content=lv};}}}