Multimedia + dostęp do karty pamięci Do odtwarzania dźwięku najwygodniej użyć klasy MediaPlayer. Można jej użyć także do odtwarzania wideo, ale wygodniej użyć VideoView. Do rejestracji dźwięku - MediaRecorder. My ograniczymy się do odtworzenia dźwięku z pliku mp3 dostępnego na karcie pamięci SD lub dołączonego do zasobów aplikacji (katalog res/raw). Można kontynuować rozwój projektu Grafika2D 0. Do projektu dodajemy _niewielki_ plik mp3. Należy utworzyć podkatalog Resources/raw. Plik chyba nie może mieć spacji, bo mogą być problemy z powstaniem identyfikator w klasie Resource (tak było w Android Studio). Ja użyłem pliku tada.wav (z Windows) i Frasier.mp3. Uwaga! Trzeba przebudować, bo pojawia się NullReferenceException po dodaniu pliku mp3 do projektu 1. W klasie aktywności deklarujemy pole: using Android.Media; namespace Grafika2D { [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true, ScreenOrientation = Android.Content.PM.ScreenOrientation.Unspecified)] public class MainActivity : AppCompatActivity { private MediaPlayer mp = null; 2. W metodzie onCreate: protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource //SetContentView(Resource.Layout.activity_main); SetContentView(new Grafika2DView(ApplicationContext, null)); try { if (mp != null && mp.IsPlaying) { mp.Stop(); mp.Reset(); } else if (mp != null) { mp.Reset(); mp.Release(); } //z zasobow mp = MediaPlayer.Create(ApplicationContext, Resource.Raw.Frasier); mp.Completion += (object sender, System.EventArgs e) => { Toast.MakeText(ApplicationContext, "Odtwarzanie utworu zostało zakończone", ToastLength.Long).Show(); }; mp.Start(); //asynchroniczne } catch (Java.Lang.Exception exc) { Toast.MakeText(ApplicationContext, "Odtworzenie utworu nie powiodło się\n" + exc.Message, ToastLength.Long).Show(); } catch (System.Exception exc) { Toast.MakeText(ApplicationContext, "Odtworzenie utworu nie powiodło się\n" + exc.Message, ToastLength.Long).Show(); } } 3. Metody wstrzymujące i wzanawiające odtwarzanie: protected override void OnPause() { mp.Pause(); base.OnPause(); } protected override void OnResume() { mp.Start(); base.OnResume(); } protected override void OnDestroy() { mp.Stop(); base.OnDestroy(); } 4. Aby odtworzyć plik zapisany na karcie pamięci, należy zmodyfikować metodę OnCreate: //z zasobow //mp = MediaPlayer.Create(ApplicationContext, Resource.Raw.Frasier); //<---- zakomentowana linia //z systemu plikow Android.Net.Uri uri = Android.Net.Uri.Parse("file:///sdcard/Frasier.mp3"); //mp = new MediaPlayer(); mp.SetDataSource(ApplicationContext, uri); mp.Prepare(); mp = MediaPlayer.Create(ApplicationContext, uri); Należy w katalogu /sdcard umieścić plik Frasier.mp3. Można go pobrać z http://fizyka.umk.pl/~jacek/dydaktyka/mobilne/xamarin/zrodla/Frasier.mp3 i potem przenieść w aplikacji Downloads. To wymaga dostępu do external storage. Udzieliłem go z ustawień: Ustawienia w Android, wyszukałem "App permissions", Storage i udzieliłem uprawnień aplikacji Grafika2D. 5. Z katalogu z pobranymi plikami: Android.Net.Uri uri = Android.Net.Uri.Parse("file:///storage/emulated/0/Download/Frasier.mp3"); 6. Odczytanie nazwy katalogu kart pamięci: string externalStoragePath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; string path = System.IO.Path.Combine(externalStoragePath, "Frasier.mp3"); Android.Net.Uri uri = Android.Net.Uri.Parse(path); PROBLEM: dostęp do plików w podkatalogach; jeżeli zajrzymy tam przed adb shell, zobaczymy: 127|generic_x86:/sdcard # ls Alarms Android DCIM Download Frasier.mp3 Movies Music Notifications Pictures Podcasts Ringtones Nie ma katalogu, który tworzymy w programie Downloads. Nieużywana własność związana z zapętlaniem MediaPlayer.Looping = true|false;.