Частенько на разных форумах всплывают вопросы об открытии файлов в приложении (ях) по умолчанию. Решил разъяснить немного ситуацию. Про сами Intent рассказывать не буду, т.к. есть очень хорошая статья (Delphi XE5: использование Intent (намерения) в Android), в которой объясняется принцип работы с интентами и имеется парочка примеров, остальные подробности вы всегда можете найти в справке Android API.
Если вам требуется открыть/запустить какой либо файл, то вам необходимо воспользоваться Интентом.
Пример №1 – откроем картинку «picture.png», которая лежит в папке «Download»
uses
System.IOUtils, FMX.Helpers.Android, Androidapi.Helpers,
Androidapi.JNI.GraphicsContentViewText;
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent;
begin
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath, 'picture.png')), StringToJString('image/png'));
SharedActivity.startActivity(Intent);
end;
Самая интересная строка:
Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath, 'picture.png')), StringToJString('image/png'));
В этой строке мы указываем:
- полный путь до файла, при этом, не забывая добавить в начало 'file:', без этого Android не поймет, что вы открываете файл
- вторым параметром идёт указание MIME Type (ниже вы найдёте список самых популярных типов, а также вариант с автоматическим определением)
Также можно указывать неполный MIME тип, например, так «image/*», «video/*» и т.п.
Таблица соответствия «расширение = MIME Type»:
| Расширение | MIME Type | |
| Android Application | .apk | application/vnd.android.package-archive |
| Text | .txt | text/plain |
| .csv | text/csv | |
| .xml | text/xml | |
| Web related | .htm | text/html |
| .html | text/html | |
| .php | text/php | |
| Image | .png | image/png |
| .gif | image/gif | |
| .jpg | image/jpg | |
| .jpeg | image/jpeg | |
| .bmp | image/bmp | |
| Audio | .mp3 | audio/mp3 |
| .wav | audio/wav | |
| .ogg | audio/x-ogg | |
| .mid | audio/mid | |
| .midi | audio/midi | |
| .amr | audio/AMR | |
| Video | .mpeg | video/mpeg |
| .3gp | video/3gpp | |
| Package | .jar | application/java-archive |
| .zip | application/zip | |
| .rar | application/x-rar-compressed | |
| .gz | application/gzip |
В Google уже позаботились об определении MIME типов и создали карту «расширение = MIME type»(Android API: android.webkit.MimeTypeMap ), нам остаётся только воспользоваться ей, а точнее её методами.
Для того, чтобы методы работали, необходимо добавить в uses модуль: «Androidapi.JNI.Webkit»
Шаги:
- Получаем расширение файла (без точки)
- Получаем экземпляр карты
- Получаем MIME type
Пример №2 – с автоматическим определением MIME Type по расширению файла.
uses
System.IOUtils, FMX.Helpers.Android, Androidapi.JNI.JavaTypes,
Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Webkit;
procedure TForm1.Button1Click(Sender: TObject);
var
ExtFile: string;
mime: JMimeTypeMap;
ExtToMime: JString;
Intent: JIntent;
begin
ExtFile := 'png';
mime := TJMimeTypeMap.JavaClass.getSingleton();
ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(StrToJURI('file:' + TPath.Combine(TPath.GetSharedDownloadsPath, 'picture.png')), ExtToMime);
SharedActivity.startActivity(Intent);
end;
На этом всё. Спасибо за внимание.
