Java android файловый менеджер

Файловый менеджер для Android своими руками

В данной статье для начинающих разработчиков программного обеспечения для операционной системы Android мы попытается пошагово разобраться, как создать свой собственный несложный файловый менеджер.

Конечно же, примеры использованного кода будут полезны и в чисто обучающих целях для новичков в Android-программировании.

Для начала, необходимо подготовиться. В первую очередь нам понадобиться IDE, то есть среда программирования. Мы будем использовать IDE Eclipse, однако это не означает, что нельзя использовать любую другу доступную среду разработки. Итак, загружаем Eclipse Classic по ссылке: https://www.eclipse.org/downloads/. Далее загружаем и устанавливаем SDK Starter Package по ссылке: http://developer.android.com/sdk/index.html. Устанавливаем ADT Plugin для Eclipse и настраиваем его.

После установки среды разработки, запускаем её. В случае, если это Eclipse, выбираем пункт меню «Window» -> «Android SDK and AVD Manager», где выбираем все необходимые для установки элементы. Проще всего, конечно, установить все компоненты, но необходимый минимум включает, в любом случае, как минимум Android 2.1/2.2, Android SDK Tools, Android SDK Platform-tools.

Среда для разработки готова. Чтобы проверять созданные приложения, можно воспользоваться удобным эмулятором виртуального Android-устройства. Эмулятор добавляется в окне Android SDK and AVD Manager. Для этого нажимаем «New…» во вкладке «Virtual Devices». Заполняем поле «Name» по желанию, указываем необходимую версию API и добавляем вновь созданный виртуальный Android-девайс.

Отметим лишь, что проверять созданные приложения на реальном физическом устройстве всё-равно крайне желательно, для пущей уверенности в его работоспособности.

Теперь приступим непосредственно к созданию нового проекта. Выбираем «File» -> «New» -> «Project», в появившемся окне выбираем «Android» -> «Android Project» и нажимаем «Next». Появившееся окно заполняем как-то вот так:

Теперь разъясним, что означают введенные данные. Project Name – это имя проекта в среде разработки Eclipse. Application Name – название приложения, которое будет видно пользователю при установке на Android-девайс. Package Name – название пакета, по аналогии с Java-проектом. Данное имя обязательно должно быть уникальным, в том числе среди всех возможных названий на конечном Android-устройстве пользователя. В связи с этим, довольно эффективно в таких целях использовать веб-домен наоборот, после которого – название самого проекта, отделенное точкой. Таким образом можно достичь достаточно высокой степени уникальности. Create Activity – это имя класса, который впоследствии будет являться подклассом класса Activity. Min SDK Version – как понятно из названия, минимальная необходимая версия SDK. Если просмотреть список Build Target нашего приложения, то становится ясно, что подходит только устройство с установленной операционной системой Android версии 2.1 (версия SDK 7) или новее. Это не столь принципиально, если только не задействуются те или иные функции, доступные только в более новых версиях ОС Android. Нажимаем «Finish» и видим свой проект в разделе «Package Explorer». Проект создан.

Итак, перед нами стоит цель – обеспечить минимальный функционал файлового менеджера, как-то – базовая навигация по каталогам, то есть даже без доступа к папкам, на которые имеет права root. Также нужно отображать в верхней части экрана текущее расположение в файловой системе.

Разберем структуру проекта:

/res/drawable-*dpi – каталоги с ресурсами, которые предназначены для устройств с разной разрешающей способностью экрана. На данном этапе здесь содержится одинокий файл icon.png – иконка для приложения.

/res/layout – директория содержит xml-файлы, которые описывают структуру и внешний вид форм и их элементов. Сразу после создания проекта, в данной папке находится файл main.xml, также создаем файл row.xml, который будет описывать внешний вид рядов – элементов списка в файловом дереве нашего файлового менеджера.

/res/values – в данной папке размещены любые константы, которые могут быть применены для работы проекта.

Редактировать .xml-файлы можно в визуальном и текстовом режимах, причем второй предпочтительнее. А поэтому для редактирования кода нажимаем правой кнопкой мышки на необходимом файле .xml в Package Explorer и выбираем пункт «Open with» -> «Text Editor».

Файл FileManager.java содержит основной класс для основной формы приложения. Здесь же будет находится весь написанный нами код.

AndroidManifest.xml – содержит все основные свойства проекта, в том числе заданные при его создании (например, название). Так что при необходимости изменить название проекта в процессе разработки приложения редактировать нужно именно этот файл.

Приступим к написанию кода, по ходу дела разбираясь, за что он отвечает. Файл main.xml:

В данном коде задана разметка для основного Layout`а. TableLayout означает, что элементы будут выстроены в виде таблицы. В верхней ячейке этой таблицы находится элемент TextView, то есть текстовое поле, а в нижней – ListView, то есть список. Оба эти элемента имеют id, используя которые, можно изменять их содержимое. К примеру, с использованием R.id.titleManager для текстового поля TextView.

Читайте также:  Оплата телефоном вместо карты андроид сбербанк как включить

В данных строках задана разметка для каждого элемента ListView, то есть для каждой папки и файла. В коде указана ширина элементов, высота, отступы (padding) и выравнивание – центрирование по вертикали (center_vertical).

В начале указано имя пакета (Package Name). Строки со 2й по 18ю отвечают за импорт необходимых для работы приложения библиотек. Eclipse умеет производить подгрузку и импорт нужных библиотек автоматически, если встречает что-либо неизвестное. Вообще, в выше изложенном коде всего пять наглядных функций, это и есть скелет приложения, который обеспечивает базовую навигацию по файловой системе Android-девайса. Единственная оговорка – при попытке открыть директорию, для доступа к которой нужны root-права, приложение выдаст ошибку и будет закрыто.

Источник

Работа с файловой системой

Чтение и сохранение файлов

Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графически файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.

ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш «/», а не обратный слеш «\» (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть «data» это не то же самое, что и «Data».

Приложение Android сохраняет свои данные в каталоге /data/data/ / и, как правило, относительно этого каталога будет идти работа.

Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:

boolean deleteFile (String name) : удаляет определенный файл

String[] fileList () : получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения

File getCacheDir() : получает ссылку на подкаталог cache в каталоге приложения

File getDir(String dirName, int mode) : получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается

File getExternalCacheDir() : получает ссылку на папку /cache внешней файловой системы устройства

File getExternalFilesDir(String type) : получает ссылку на каталог /files внешней файловой системы устройства

File getFileStreamPath(String filename) : возвращает абсолютный путь к файлу в файловой системе

FileInputStream openFileInput(String filename) : открывает файл для чтения

FileOutputStream openFileOutput (String name, int mode) : открывает файл для записи

Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.

Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io.

Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:

Поле EditText предназначено для ввода текста, а TextView — для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.

Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:

При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)

В данном случае введенный текст будет сохраняться в файл «content.txt». При этом будет использоваться режим MODE_PRIVATE

Система позволяет создавать файлы с двумя разными режимами:

MODE_PRIVATE : файлы могут быть доступны только владельцу приложения (режим по умолчанию)

MODE_APPEND : данные могут быть добавлены в конец файла

Поэтому в данном случае если файл «content.txt» уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:

Для чтения файла применяется поток ввода FileInputStream :

Подробнее про использование потоков ввода-вывода можно прочитать в руководстве по Java: https://metanit.com/java/tutorial/6.3.php

В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt

Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer

После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.

Источник

AndroidDev #1. Создаем файловый менеджер

Android — перспективная и динамично развивающаяся операционная система. И многие программисты хотят научиться программировать приложения для OS Android, но беглый поиск структурированных материалов в сети Интернет и, в частности, Рунете, приводит их в ступор. Действительно, до сих пор существует проблема поиска обучающих статей (особенно на русском языке) по разработке приложений для этой весьма популярной операционной системы.
Ну, что ж, будем потихоньку улучшать данную ситуацию при помощи Хабра.
Сразу предупрежу, что материалы предназначены для тех, кто не имеет опыта разработки приложений для Android, но очень-очень хочет этот опыт приобрести.

Читайте также:  Шахматы по сети с другом андроид

Готовимся

Первое, что нам потребуется — установить и настроить IDE. Мы будем использовать Eclipse, однако важно отметить, что существует возможность использовать любую среду разработки.
Подробная инструкция по установке и настройке IDE Eclipse содержится в документации на сайте Android. Если вкратце:

  • Устанавливаем Eclipse Classic отсюда
  • Устанавливаем SDK Starter Package отсюда
  • Устанавливаем ADT Plugin при помощи данной инструкции, по той же инструкции выполняем действия, описанные в разделе Configuring the ADT Plugin
  • Запускаем Eclipse, нажимаем Window > Android SDK and AVD Manager и выбираем необходимые компоненты для установки. Самый простой вариант — выбрать всё, но необходимый минимум — SDK Platform Android 2.1 (или 2.2), Android SDK Tools, Android SDK Platform-tools

После всего этого мы имеем рабочую среду для разработки приложений для ОС Android. Но нам нужно где-то проверять наши приложения, верно? И тут мы стоим перед выбором — либо осуществлять эти действия в эмуляторе, либо на реальном устройстве.
Эмулятор можно добавить в уже знакомом нам окне Android SDK and AVD Manager, нажав кнопку New. во вкладке Virtual Devices. Заполняем поле Name, указываем версию API и добавляем наше виртуальное устройство.

Если же вы хотите тестировать свои приложения на реальном устройстве, смотрите сюда. Важно отметить, что в конечном счёте вам всё равно придётся проверять своё приложение на реальном устройстве, ведь немного странно выпускать приложение, допустим, в Android Market, как следует его не протестировав на действующих образцах телефонов/планшетов.

Создаем проект

Пришло время создать новый проект. Для этого жмём File > New > Project, выбираем в появившемся окне Android > Android Project и жмем Next. Появляется следующее окно, которое мы заполняем примерно так:

Теперь немного объяснений.
Project Name — имя проекта в среде Eclipse.
Application Name — название приложение, то самое, которое будут видеть пользователи на конечном Android-устройстве.
Package Name — название пакета. Тут всё аналогично любому Java-проекту. Важно знать, что данное имя должно быть уникальным среди всех пакетов, имеющихся на конечном устройстве. Посему достаточно эффективна классическая логика давать название, соответствующего веб-домену, записанному наоборот (как тут — ru.alwake), а далее — название самого проекта. Данный шаг в какой-то мере обеспечит уникальность названия.
Create Activity — имя класса, который в будущем будет являться подклассом класса Activity.
Min SDK Version — минимальная версия SDK. Если посмотреть выше на список Build Target в данном окне, то можно прийти к выводу, что наше приложение запускается только для устройств с Android >= 2.1 (Android 2.1 соответствует версия SDK 7). В данном случае это не очень принципиально, но пусть будет так.

Теперь можно смело нажать Finish и лицезреть свой проект в панели Package Exploper. Проект создан и неплохо бы ознакомиться с некоторой теоретической основой по устройству Android-приложений, которая неплохо изложена тут.

О нашем проекте

Для начала определимся, что мы хотим от нашего файлового менеджера. В идеале — полную замену ASTRO и eStrongs. Ну, а пока нам требуется обеспечить базовую навигацию по каталогам, причем под «базовой» мы понимаем, что нам не нужно заходить в те папки, в которые имеет доступ только root. Помимо этого, в поле сверху у нас будет отображаться наше текущее расположение в структуре каталогов.

Ну, а сначала поговорим о структуре проекта:

/res/drawable-*dpi — в этих трёх папках у нас содержатся ресурсы, предназначенные для разных расширений экрана. На данный момент там имеется всего-навсего файл icon.png, то есть иконка нашего приложения.
/res/layout — в данной папке содержатся xml-файлы, описывающие внешний вид форм и различных элементов форм. После создания проекта там уже имеется файл main.xml, также там нужно создать файл row.xml, который будет описывать внешний вид каждого отдельно взятого ряда (то есть элемента списка нашего файлового древа).
/res/values — тут у нас располагаются какие-либо константы, которые мы можем использовать в нашем проекте.

Стоит отметить, что данные XML-файлы можно редактировать как в визуальном режиме, так и в текстовом (меняя непосредственно xml-код). Мы будем действовать по второму способу. Для редактирования кода необходимо нажать правой кнопкой по xml-файлу в панели Package Explorer и выбрать Open with > Text Editor. Это так, на будущее 😉

Файл FileManager.java — в данном файле, собственно, содержится наш основной класс для главной и единственной формы приложения. Весь наш код в данном проекте будет размещаться тут.
Файл AndroidManifest.xml — файл с основными свойствами нашего проекта, в частности, заданными при создании проекта (такими как, например, название). Соответственно, чтобы поменять, предположим, название, нам нужно ковырять данный файл.

Читайте также:  Андроид не поддерживает миракаст

Остальные файлы нас пока мало интересуют.

Начинаем писать код

В общем-то, всё что было выше — базовые сведения, которые каждый Android-программист обязан знать. А теперь пришла пора разбираться непосредственно с нашим кодом.

xml version =»1.0″ encoding =»utf-8″ ? >
TableLayout xmlns:android =»http://schemas.android.com/apk/res/android»
android:orientation =»vertical»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent» >

TableRow >
TextView android:id =»@+id/titleManager»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:padding =»5dip»
/>
TableRow >
TableRow >
ListView android:id =»@id/android:list»
android:layout_width =»fill_parent»
android:layout_height =»fill_parent»
android:layout_weight =»2″
android:drawSelectorOnTop =»false»/>
TableRow >
TableLayout >

* This source code was highlighted with Source Code Highlighter .

Здесь у нас задается разметка для нашего основного Layout’а формы. TableLayout здесь значит, что элементы у нас выстроены в виде таблицы. Далее в верхней ячейке таблицы размещается элемент TextView (текстовое поле), а в нижней ячейке — ListView (список). Оба элемента имеют id, используя который, мы можем изменять содержимое элементов. Например, используя R.id.titleManager для нашего текстового поля TextView.

xml version =»1.0″ encoding =»utf-8″ ? >
TextView
xmlns:android =»http://schemas.android.com/apk/res/android»
android:layout_width =»fill_parent»
android:layout_height =»40sp»
android:padding =»5dip»
android:gravity =»center_vertical»
/>

* This source code was highlighted with Source Code Highlighter .

Здесь мы задаем разметку для каждого элемента нашего ListView, то есть непосредственно для каждой отдельно взятой папки или каждого файла. В данном коде у нас задается ширина каждого элемента, высота, отступ (padding) и выравнивание center_vertical — то есть центрование по вертикали.

  1. package ru.alwake.filemanager;
  2. import java.io. File ;
  3. import java.util. ArrayList ;
  4. import java.util. List ;
  5. import android.app.AlertDialog;
  6. import android.app.ListActivity;
  7. import android.content.DialogInterface;
  8. import android.content.Intent;
  9. import android.content.DialogInterface.OnClickListener;
  10. import android.net. Uri ;
  11. import android.os.Bundle;
  12. import android.view.View;
  13. import android.widget.ArrayAdapter;
  14. import android.widget.ListView;
  15. import android.widget.TextView;
  16. public class FileManager extends ListActivity <
  17. private List String > directoryEntries = new ArrayList String >();
  18. private File currentDirectory = new File ( «/» );
  19. //when application started
  20. @Override
  21. public void onCreate(Bundle icicle) <
  22. super.onCreate(icicle);
  23. //set main layout
  24. setContentView(R.layout.main);
  25. //browse to root directory
  26. browseTo( new File ( «/» ));
  27. >
  28. //browse to parent directory
  29. private void upOneLevel() <
  30. if ( this .currentDirectory.getParent() != null ) <
  31. this .browseTo( this .currentDirectory.getParentFile());
  32. >
  33. >
  34. //browse to file or directory
  35. private void browseTo(final File aDirectory) <
  36. //if we want to browse directory
  37. if (aDirectory.isDirectory()) <
  38. //fill list with files from this directory
  39. this .currentDirectory = aDirectory;
  40. fill(aDirectory.listFiles());
  41. //set titleManager text
  42. TextView titleManager = (TextView) findViewById(R.id.titleManager);
  43. titleManager.setText(aDirectory.getAbsolutePath());
  44. > else <
  45. //if we want to open file, show this dialog:
  46. //listener when YES button clicked
  47. OnClickListener okButtonListener = new OnClickListener() <
  48. public void onClick(DialogInterface arg0, int arg1) <
  49. //intent to navigate file
  50. Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri .parse( «file://» + aDirectory.getAbsolutePath()));
  51. //start this activity
  52. startActivity(i);
  53. >
  54. >;
  55. //listener when NO button clicked
  56. OnClickListener cancelButtonListener = new OnClickListener() <
  57. public void onClick(DialogInterface arg0, int arg1) <
  58. //do nothing
  59. //or add something you want
  60. >
  61. >;
  62. //create dialog
  63. new AlertDialog.Builder( this )
  64. .setTitle( «Подтверждение» ) //title
  65. .setMessage( «Хотите открыть файл » + aDirectory.getName() + «?» ) //message
  66. .setPositiveButton( «Да» , okButtonListener) //positive button
  67. .setNegativeButton( «Нет» , cancelButtonListener) //negative button
  68. .show(); //show dialog
  69. >
  70. >
  71. //fill list
  72. private void fill( File [] files) <
  73. //clear list
  74. this .directoryEntries.clear();
  75. if ( this .currentDirectory.getParent() != null )
  76. this .directoryEntries.add( «..» );
  77. //add every file into list
  78. for ( File file : files) <
  79. this .directoryEntries.add(file.getAbsolutePath());
  80. >
  81. //create array adapter to show everything
  82. ArrayAdapter String > directoryList = new ArrayAdapter String >( this , R.layout.row, this .directoryEntries);
  83. this .setListAdapter(directoryList);
  84. >
  85. //when you clicked onto item
  86. @Override
  87. protected void onListItemClick(ListView l, View v, int position, long id) <
  88. //get selected file name
  89. int selectionRowID = position;
  90. String selectedFileString = this .directoryEntries. get (selectionRowID);
  91. //if we select «..» then go upper
  92. if (selectedFileString.equals( «..» )) <
  93. this .upOneLevel();
  94. > else <
  95. //browse to clicked file or directory using browseTo()
  96. File clickedFile = null ;
  97. clickedFile = new File (selectedFileString);
  98. if (clickedFile != null )
  99. this .browseTo(clickedFile);
  100. >
  101. >
  102. >

* This source code was highlighted with Source Code Highlighter .

В начале указывается название пакета (package name).
Строки 2-18 отвечают за импорт нужных нам библиотек. Важно отметить, что импорт библиотек Eclipse может производить автоматически, как только встретит что-нибудь неизвестное.
В данном коде у нас всего 5 достаточно очевидных функций, в которых несложно разобраться. И это — скелет приложения, обеспечивающий основную навигацию по файловой структуре. Однако у данного приложения существует одна проблема — при попытке зайти в директорию, доступ к которой разрешен только суперпользователю, мы получаем ошибку и приложение завершает работу.
Соответственно, в следующий раз мы подумаем как избавиться от этой ошибки, а также о том, как сделать отображение иконок, соответствующих типу файла. Кроме того, мы подумаем о реализации функции Copy-Paste в нашем файловом менеджере.

В конечном счёте предполагается получить большое и грамотное приложение, которое должно дать основную информацию об аспектах программирования под Android.

Источник

Оцените статью