Вопросы программирования для мобильных операционных систем, разработка под андроид, работа с питоном. Статьи на эти темы можно прочитать в данном разделе.

Программирование для смартфонов » страница 1


смотрите также: Новости посетителей

| категории | RSS |


  



Программирование для смартфонов
Wed, 16 Dec 2015 10:04:17 +0300

Здравствуйте!
Хотел бы продолжить делиться впечатлениями о разработке приложений под платформу Android с использованием фрейворка Kivy. На примере разрабатываемого мною клиента HeaTDV4A для сайта dimonvideo.ru в прошлой статье были рассмотрены такие полезные виджеты, как Label, BoxLayout, Button, Image. Сегодня уделим вниманиеActionBar, ActionOverflow, ActionButton, ActionGroup для построения такой нужной и функциональной части интерфейса программы, как ActionBar!



Как вы можете видеть, это панель в нижней части экрана приложения, без которой не обходится почти ни одно приложение на Android. Мы можем размещать на панели кнопки, выпадающие списки меню и другие функциональные виджеты. Данный экран — это видоизмененный интерфейс приложения HeaTDV4A из первой части статьи. Такой макет вы увидите, если запустите новую версию startscreen.py из папки ./Libs/ui директории приложения, архив которого прилагается ниже.
Но давайте ближе к делу, и рассмотрим код startscreen.py:\\

 startscreen.py

#! /usr/bin/python2.7
# -*- coding: utf-8 -*-
#
# startscreen.py
#
# Главный экран программы.
#
# Декабрь, 2015
# Луганск
# Автор сценария: Иванов Юрий aka HeaTTheatR
#
# Email: e-mail
# e-mail
#

__version__ = "0.2"

import os

try:
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.actionbar import ActionBar, ActionView, ActionPrevious, \\
ActionOverflow, ActionButton, ActionGroup
from kivy.properties import ObjectProperty, ListProperty, StringProperty
except Exception, text_error:
raise text_error

class StartScreen(BoxLayout):
"""Стартовый экран программы."""

events_callback = ObjectProperty(None) # функция обработки сигналов экрана
buttons_menu = ListProperty() # пути к иконкам для кнопок ActionBar
buttons_group = ListProperty() # имена пунктов кнопок меню в ActionGroup
previous = StringProperty("") # путь к иконке для ActionPrevious
title_previous = StringProperty("My program") # заголоок ActionBar
title_image = StringProperty("") # путь к изображению для шапки програмы
title_image_size = ListProperty((1, .7)) # размер изображения шапки програмы
# Путь к иконке для ActionOverflow.
overflow_image = StringProperty("atlas://data/images/defaulttheme/overflow")
previous_image = StringProperty(
"atlas://data/images/defaulttheme/previous_normal")

def __init__(self, **kvargs):
super(StartScreen, self).__init__(**kvargs)
self.orientation = "vertical"

# Логотип, тело программы и ActionBar внизу экрана.
logo = Image(source=self.title_image, size_hint=self.title_image_size)
self.body_program = BoxLayout()
action_box = BoxLayout()
action = ActionBar()
action_view = ActionView(use_seperator=True)
action_previous = ActionPrevious(app_icon=self.previous,
title=self.title_previous,
with_previous=True, id="previous",
on_press=self.events_screen)
action_overflow = ActionOverflow()

# Создаем кнопки для выпадающего списка ActionOverflow.
for item_name in self.buttons_group:
item_button = ActionButton(text=item_name, id=item_name,
on_press=self.events_screen)
action_overflow.add_widget(item_button)
action_view.add_widget(action_previous)
action_view.add_widget(action_overflow)

# Создаем кнопки меню в ActionBar.
for path_image in self.buttons_menu:
name_image = os.path.split(path_image).split(".")
action_group = ActionGroup(text=name_image)
button_menu = ActionButton(icon=path_image, id=name_image,
on_press=self.events_screen)
action_group.add_widget(button_menu)
action_view.add_widget(action_group)
action.add_widget(action_view)
action_box.add_widget(action)

# Добавляем созданные виджеты в корневой бокс-виджет.
self.add_widget(logo)
self.add_widget(self.body_program)
self.add_widget(action_box)

def events_screen(self, button_menu):
"""
Вызывается при нажатии кнопок меню программы.
type button_menu: instance <class 'kivy.uix.button.Button'>;

"""

if callable(self.events_callback):
self.events_callback(button_menu)


if __name__ in :
import kivy
kivy.require("1.9.0")

from kivy.app import App

try:
from kdialog import KDialog
except ImportError:
KDialog = None


class Test(App):
def build(self):
title_image = "{}{}".format(kivy.kivy_data_dir,
"/logo/kivy-icon-512.png")
return StartScreen(title_image=title_image,
buttons_menu=,
buttons_group=,
events_callback=self.on_press_button_menu)

def on_press_button_menu(self, button_menu):
"""Вызывается при выборе одного из пунктов меню программы."""

if not KDialog:
print "Нажата кнопка меню с id '{}'!".format(button_menu.id)
else:
message = KDialog()
message.show(text="Нажата кнопка меню с id "
"'{}'!".format(
button_menu.id))


Test().run()

Поскольку все это мы рассматривали ранее, разберем лишь некоторую часть кода: создание ActionBar и создание переменных с использованием kivy.properties.
Итак, строки 54-77:

Собственно бар.

action = ActionBar()

Контейнер для контента бара:

action_view = ActionView(use_seperator=True)

Контейнер, куда мы поместим иконку и имя бара.



Параметры:

app_icon='Путь к иконке'
title='Имя бара'
previous_image='Путь к иконке превью'
with_previous - указывает, нажав на ActionPrevious будет ли загрузжен предыдущий экран или нет. Если True, он будет отображен в previous_icon.



action_previous = ActionPrevious(app_icon=self.previous,
title=self.title_previous,
previous_image=self.previous_image,
with_previous=True, id="previous",
on_press=self.events_screen)


Контейнер (выпадающий список кнопок), в который мы добавим пункты меню нашего приложения:




action_overflow = ActionOverflow(overflow_image=self.overflow_image)


Здесь не будем ничего уточнять, поскольку кнопки ActionButton это почти такие же кнопки, как обычные Button только хуже Вы не можете программно настроить их параметры, кроме как используя Kv Language или создав собственный класс Button производный от ActionItem.





# Создаем кнопки для выпадающего списка ActionOverflow.
for item_name in self.buttons_group:
item_button = ActionButton(text=item_name, id=item_name,
on_press=self.events_screen)
action_overflow.add_widget(item_button)
action_view.add_widget(action_previous)
action_view.add_widget(action_overflow)


ActionGroup — это разделительная вертикальная полоса между которой мы помещаем созданые нами кнопки. Параметр text — это просто своего рода id.






# Создаем кнопки меню в ActionBar.
for path_image in self.buttons_menu:
name_image = os.path.split(path_image).split(".")
action_group = ActionGroup(text=name_image)
button_menu = ActionButton(icon=path_image, id=name_image,
on_press=self.events_screen)
action_group.add_widget(button_menu)
action_view.add_widget(action_group)


В общим и целом получаем вот такой симпатичный функциональный бар:






action.add_widget(action_view)
action_box.add_widget(action)


Запуск макета со всеми параметрами (список изображений-кнопок, список имен кнопок меню) из файла HeaTDV4A директории программы даст вот такой результат:




kivy.properties.

Справка от werton:
kivy properties это шаблон, где реализованы полезные удобности, без которых вполне можно обойтись или реализовать их самостоятельно, но зачем это делать, если это уже кто-то постарался за нас. Соответственно, использовать их стоит только там где это оправданно, где требуется манипуляция значениями с контролем их величины и реализацией действий на изменение этих значений (об этом ниже). Как правило, внутри виджетов, все свойства объявляемые в стиле так же являются properties.

Что дают properties:

1. Это удобное объявление в теле класса, а не внутри метода __init__():


class MyClass(EventDispatcher):
numeric_var = NumericProperty(1)


против:


class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.numeric_var = 1



2. Это реализация метода on_


class CustomBtn(Widget):
custom_value = NumericProperty(0)
def on_custom_value(self, instance, value):
print instance, value


То есть, если ты объявил внутри класса, например, свойство custom_value = ListProperty(0), то в классе автоматически реализовывается метод on_custom_value(self, instance, value), который вызывается при любом изменении значения custom_value, с параметрами instance(ссылка на экземпляр класса) и value (новое значение custom_value).


btn = CustomBtn()
btn.custom_value = 1


Это очень удобно для реализации действий на изменение значений custom_value, например, если теперь изменить custom_value = 1, то в этом месте будет вызван метод on_custom_value(btn, 1).
Так же к custom_value можно привязать свою callback функцию, которые так же будут вызываться при изменении значения custom_value с параметрами instance, value:


def callback_func(instance, value):
print 'My callback is call from', instance
print 'and the a value changed to', value
btn.bind(custom_value=callback_func)


3. Это контроль значений, т.е. properties проверяют тип и величину присеваемого им значения после объявления
вызывая ValueError при его несоответствии.

На этом пока закончим статью, ибо, чувствую, информации уже слишком много для одной статьи. В следующей будут рассмотрены построение панели настроек с помощью .json-файлов и работа с «самодельным» модулем диалоговых окон kdialog.py.
А пока вы можете скачать архив heatdv4a.zip - 469.56 Kb, запустить одноименный файл и протестировать работу приложения. На данный момент юзабельными являются пункты меню «Войти, Настройки, Лицензия, About, Выход».

Скрины тестового приложения:

 screen1



 screen3



 screen4



 screen5



HeaTTheatR
Фруктовый Python! Часть 2.


Здравствуйте!
Хотел бы продолжить делиться впечатлениями о разработке приложений под платформу Android с использованием фрейворка Kivy. На примере разрабатываемого мною клиента HeaTDV4A...

подробнее
Программирование для смартфонов
Wed, 01 Apr 2015 20:10:11 +0300Небольшой мануал к вопросам на форуме в теме посвященной мобильным средам разработки. мобильные среды разработки - форум
Итак что же такое spk файл и как им пользоваться.
spk файл предназначен для того что бы можно было делиться своими приложениями с другими пользователями непосредственно из программы. Как это сделать ? жмем >> долгий тап на скрипте (которым хотим поделиться) >> "share via Email" и выбираем приложение (почтовый клиент если хотим отправить по почте или сохранить файловым менеджером если нужен spk в памяти смартфона).

С этим все понятно и просто думаю. Далее давайте разберемся как же нам установить и посмотреть исходники программы которой с нами поделились. Расскажу на примере Es проводника (впринципи с остальными фм проблем возникнуть тоже не должно). Идем по пути где лежит файл. Делаем на нем долгий тап и в правом нижнем углу нажимаем кнопку меню "еще" >> "отправить" ( именно "отправить", "открыть в" не приведет ни к какому результату) >> в списке приложений выбираем droidScript. Ds установит spk файл самостоятельно и он появится в меню проектов( папка и js файл создаются самостоятельно). Удобно вполне. Spk файл хоть и ассоциируется с Ds и при тапе открывается в нем но в меню он не появляется и установка не проходит. Отсюда и непонятки с спк возникали у некоторых.
Zaterehniy
использование spk файлов в DroidScript

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

подробнее
Программирование для смартфонов
Wed, 30 Jul 2014 00:36:37 +0400Создание и управление интерфейсом на Android с Python. Часть 5.



Всем привет! После долгого перерыва связанным решил продолжить серию статей, посвященных разработке интерфейса под платформу Android на языке программирования Python.
И сегодня мы, как всегда, будем опровергать распространенное мнение, что якобы до сих пор в проектах Python for Android (далее P4A) не построить приличного интерфейса, кроме как общение с пользователем посредством диалоговых окон. Так считают те, кто просто не умеет и, главное, не хочет учится и развиваться в этом направлении.
На самом деле, в построении интерфейса P4A нет ничего сложного и, лично для меня, его программирование значительно проще и удобнее, чем на, ныне мертвой, платформе Symbian.
Собственно, сегодняшняя статья и примеры в ней, в отличие от предыдущих, будут не демонстративно-показательны, а максимально приближены к работе реального приложения. Мы рассмотрим переключение layout-ов в приложениях P4A на примере разрабатываемого мною клиента "HeaTDV4A" для нашего сайта и заодно протестуем работу модуля pySetting (подробнее об эксплуатации модуля читайте в документации самого модуля).

Ранее, функцией fullShow("путь к макету") я подключал различные интерфейсы в одном скрипте. На моем старом устройстве это приводило к тому, что на секунду первый макет интерфейса исчезал, как будто бы приложение закрылось, и через секунду появлялся второй вызваный макет. Это было неприемлемо и эстетически некрасиво. Тогда я попробовал помещать подключение новых layout-oв в отдельные модули, после чего данная проблема была решена. На новом девайсе подобных траблов, связанных с миганием дисплея, я не замечал, однако с тех пор приучил себя разбивать вызовы макетов интерфейса на модули. Во-первых, это делает код намного читабельней и понятней как для других программистов, так и для вас самих. Во-вторых, если вы вызвали функцию fullShow и открыли второй макет интерфейса, чтобы вернуться к первому экрану, вам придется либо заново "рисовать" главный экран поверх второго, либо вызвать функцию fullDismiss. Во втором случае вы закроете все вызваные функцией fullShow макеты интерфейса, что, согласитесь, нам не нужно.

Итак, от слов к делу! Давайте "нарисуем" два макета интерфейса и попробуем вывести на экран сначала первый, а затем второй при условии, что второй макет находится в отдельном модуле.

Файл program.py
 Показать / Скрыть текст
# -*- coding: utf-8 -*-

import sys
import os

# запрещаем создавать байт-компилированые версии модулей программы
# так как приветствуем только открытый исходный код
sys.dont_write_bytecode = True
# корневая директория программы
program_path = "%s/scripts/P4A/Example1" % os.getcwd()
sys.path.append("%s/libs" % program_path)

import android
# визуализация пользовательских настроек
# в нашем случае это и будет подключение нового макета интерфейса
import pySetting


droid = android.Android()


def showSetting():
"""Выводит на экран меню настроек"""

# список пунктов настроек
setting_list = \\

# цвет текста пунктов настроек
text_color="#cccccc"
# цвет подложки
background_color="#000000"
# высота изображения на экране
size_img_title="80dp"
# путь к изображению
path_to_img = "%s/res/Drawable/labelsetting.jpg" % program_path

# экземпляр класса визуализации пользовательских настроек
setting = pySetting.Setting(
setting_list,
"#cccccc",
"#000000",
"%s/res/Drawable/labelsetting.jpg"
% program_path,
"80dp")
# возвращает словарь вида {"имя пункта": true" либо "false"}
# "true" - пункт выбран и "false" - пункт не выбран
result = setting.show()


def run():
# загружаем макет интерфейса
droid.fullShow(open("%s/res/Layouts/home.xml" % program_path).read())
# устанавливаем изображение в верхней части экрана домашней страницы
droid.fullSetProperty("up_bar", "background", "file://%s/res/Drawable/DV.jpg" % program_path)

droid.addOptionsMenuItem("Настройки", "setting", True, "ic_menu_manage")
droid.addOptionsMenuItem("Выход", "exit", True, "ic_delete")

# ожидание событий от пользователя
while True:
signal = droid.eventWait(50).result
if signal:
# проверка на принадлежность событий к выбору пунктов меню
# если нажата клавиша "возврат"
if signal == 'key' and signal == '4':
if exitProgram():
break
# пункт меню "Настройки"
elif signal == "setting":
showSetting()
# пункт меню "Выход"
elif signal == "exit":
if exitProgram():
break
sys.exit(0)


def exitProgram():
# создаем окно диалога с двумя клавишам выбора
droid.dialogCreateAlert("HeaTDV4A:", "Закрыть программу?")
droid.dialogSetPositiveButtonText("Да")
droid.dialogSetNegativeButtonText("Нет")
droid.dialogShow()

response = droid.dialogGetResponse().result
result = response]

if result == 'positive':
return True
else:
return False


run()

Запустив пример, мы увидим следующее:
 Показать / Скрыть текст

Теперь если выбрать "Меню/Настройки" нам откроется новый экран с пунктами настроек программы:
 Показать / Скрыть текст

Нажав клавишу "Возврат" мы благополучно попадем в экран первого макета.

На этом пока все. Вот ссылка на архив примера. Распаковать папку P4A в папку sl4a.

Автор: Иванов Юрий, aka HeaTTheatR
HeaTTheatR
Создание и управление интерфейсом на Android с Python. Часть 5

Создание и управление интерфейсом на Android с Python. Часть 5.
Всем привет! После долгого перерыва связанным решил продолжить серию статей, посвященных разработке интерфейса под платформу...

подробнее
Программирование для смартфонов
Sun, 17 Feb 2013 09:16:05 +0400СОЗДАНИЕ И УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ НА ANDROID С PYTHON. ЧАСТЬ 4



Buenos dias! Сегодня статья будет короткая, зато познавательная. Я "назову" 150 имен иконок, которые применяются для создания меню в методе addOptionsMenuItem. И это далеко не весь список. Если помните, во второй части статьи, при создании текстового редактора, наше меню содержало только названия пунктов. Теперь наше приложение может выглядеть немного ярче. Примерно, вот так:



Да, я не стал выдумывать что-то новое, а воспользовался лицом приложения из прошлой статьи. Какие функции у нашей сегодняшней программы? Показ иконок и их имен по нажатию клавиши "menu". Вам будет предложен один единственный пункт "Обновить". Нажимаем. Меню скрывается, а над зеленым Андроидом на экране печатается строка "Просмотрено 0 из 150 иконок". Снова открываем меню, и видем пять пунктов с иконками и их именами в качестве названий пунктов. Шестой пункт - все тот же пункт "Обновить", он не имеет иконки. В конце статьи будет ссылка на архив с проектом программы, в нем вы найдете файл с именами иконок.

Хотя, думаю, это никчему, потому что при нажатии на пункт меню с иконкой, ее имя копируется в буфер обмена (предложенно Zaterechnyi). Очень практично, потому что запомнить как выглядят, а уж тем более называются более сотни иконок тяжеловато.

Кстати, о проектах... Может, кому-то будет интересно. Когда пишешь сценарий, приходится неоднократно запускать скрипт на выполнение, чтобы понаблюдать за его работой. Очень неудобно постоянно заходить в менеджер SL4A и искать в дереве проектов нужный. Я создаю в новом проекте два файла: имя_программы.py и main.py. Файл имя_программы.py я сразу переношу на рабочий стол, это такой же файл, как default.py в проектах на Symbian OS, в нем содержится импорт основного кода программы. Так вот, на рабочем столе у меня скрипт с кодом:



# -*- coding: utf-8 -*-

try:
import main # основной код программы
except Exception, exc:
import os
import traceback

import droidInterface

droidInterface.query(title="FatalError:", message="%s %s" %(str(exc), """

Полный лог ошибки смотрите
в корневой директории программы!
"""))
traceback.print_exc(file=open("%s/error.log"%(os.path.dirname(__file__)), "w"))




В случае ошибки, у меня окошко с именем бага и соответственно отчет в корне проекта. И потом, даже во время выполнения программы, не только во время ее запуска, в случае проблем, я всегда буду извещен. Я люблю порядок
В заключении хотел осветить еще одну деталь. Запущенное приложение, как его свернуть и развернуть? Стрелка "назад" не работает (управление клавишами в следующей статье), но тапом по "Home" мы выходим на рабочий стол. Как вернуться? В самом верху экрана, в запущеных процессах можно увидеть иконку SL4A. Открываем, выбираеми видим следующее:



Теперь, чтобы вернуться в наше приложение, достаточно нажать на стрелку "назад".
На этом пока все, Adios, amigos!

P.S.
Чуть не забыл! Архив с проектом программы - 118.68 Kb

Автор: Иванов Юрий (HeaTTheatR)
HeaTTheatR
Создание и управление интерфейсом на Android с Python. Часть 4

СОЗДАНИЕ И УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ НА ANDROID С PYTHON. ЧАСТЬ 4
Buenos dias! Сегодня статья будет короткая, зато познавательная. Я "назову" 150 имен иконок, которые применяются для...

подробнее
Реклама
Sun, 17 Feb 2013 09:16:05 +0400СОЗДАНИЕ И УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ НА ANDROID С PYTHON. ЧАСТЬ 4



Buenos dias! Сегодня статья будет короткая, зато познавательная. Я "назову" 150 имен иконок, которые применяются для создания меню в методе addOptionsMenuItem. И это далеко не весь список. Если помните, во второй части статьи, при создании текстового редактора, наше меню содержало только названия пунктов. Теперь наше приложение может выглядеть немного ярче. Примерно, вот так:



Да, я не стал выдумывать что-то новое, а воспользовался лицом приложения из прошлой статьи. Какие функции у нашей сегодняшней программы? Показ иконок и их имен по нажатию клавиши "menu". Вам будет предложен один единственный пункт "Обновить". Нажимаем. Меню скрывается, а над зеленым Андроидом на экране печатается строка "Просмотрено 0 из 150 иконок". Снова открываем меню, и видем пять пунктов с иконками и их именами в качестве названий пунктов. Шестой пункт - все тот же пункт "Обновить", он не имеет иконки. В конце статьи будет ссылка на архив с проектом программы, в нем вы найдете файл с именами иконок.

Хотя, думаю, это никчему, потому что при нажатии на пункт меню с иконкой, ее имя копируется в буфер обмена (предложенно Zaterechnyi). Очень практично, потому что запомнить как выглядят, а уж тем более называются более сотни иконок тяжеловато.

Кстати, о проектах... Может, кому-то будет интересно. Когда пишешь сценарий, приходится неоднократно запускать скрипт на выполнение, чтобы понаблюдать за его работой. Очень неудобно постоянно заходить в менеджер SL4A и искать в дереве проектов нужный. Я создаю в новом проекте два файла: имя_программы.py и main.py. Файл имя_программы.py я сразу переношу на рабочий стол, это такой же файл, как default.py в проектах на Symbian OS, в нем содержится импорт основного кода программы. Так вот, на рабочем столе у меня скрипт с кодом:



# -*- coding: utf-8 -*-

try:
import main # основной код программы
except Exception, exc:
import os
import traceback

import droidInterface

droidInterface.query(title="FatalError:", message="%s %s" %(str(exc), """

Полный лог ошибки смотрите
в корневой директории программы!
"""))
traceback.print_exc(file=open("%s/error.log"%(os.path.dirname(__file__)), "w"))




В случае ошибки, у меня окошко с именем бага и соответственно отчет в корне проекта. И потом, даже во время выполнения программы, не только во время ее запуска, в случае проблем, я всегда буду извещен. Я люблю порядок
В заключении хотел осветить еще одну деталь. Запущенное приложение, как его свернуть и развернуть? Стрелка "назад" не работает (управление клавишами в следующей статье), но тапом по "Home" мы выходим на рабочий стол. Как вернуться? В самом верху экрана, в запущеных процессах можно увидеть иконку SL4A. Открываем, выбираеми видим следующее:



Теперь, чтобы вернуться в наше приложение, достаточно нажать на стрелку "назад".
На этом пока все, Adios, amigos!

P.S.
Чуть не забыл! Архив с проектом программы - 118.68 Kb

Автор: Иванов Юрий (HeaTTheatR)
DimonVideo


Программирование для смартфонов
Fri, 15 Feb 2013 15:17:29 +0400СОЗДАНИЕ И УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ НА ANDROID С PYTHON. ЧАСТЬ 3.



Buenos dias! Сегодня, как и обещал, мы попробуем немного раскрасить наш интерфейс с помощью картинок. А именно: добавим к нашему приложению фон в виде изображения и сделаем небольшую панель инструментов. Поскольку наш сценарий будет использовать картинки и другие файлы, в конце статьи, по ссылке вы можете скачать архив с исходниками. Вот то, что в итоге у нас должно получится.



Скромно и со вкусом. Что будет уметь наша программа? Перед пользователем откроется зеленая рожица Android и три клавиши-иконки слева, в центре и справа внизу. Нажатие на клавишу слева - информация об авроре, правую - выход. Событие по нажатию в центр откроет окно для ввода текста. После подтверждения ввода, фраза будет посимвольно напечатана на экране. В принципе, это все.
Вот макет нашего интерфейса:

main.xml


<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cloth"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Full Image"
android:gravity="center"
android:textSize="30dp"
android:textColor="#ffffff"
android:textStyle="bold"/>
<FrameLayout
android:id = "@id+/ViewText"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/buttonClose"
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_gravity="bottom|right">
</Button>
<Button
android:id="@+id/buttonInfo"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="bottom|left">
</Button>
<Button
android:id="@+id/buttonStart"
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_gravity="bottom|center">
</Button>
</FrameLayout>
</LinearLayout>


Сценарий Python:


# -*- coding: utf-8 -*-

# fullImage.py

import os
import sys

import droidInterface

droid = droidInterface.droid
full_path = os.path.dirname(__file__)
droidInterface.set_menu()

# лицо нашего приложения по макету main.xml
droid.fullShow(open("%s/res/layout/main.xml" %(full_path)).read())
# фон нашего приложения
# в качестве значения параметру "background"
# мы передаем файл с изображением
# аналогично поступаем с кнопками
# можно не использовать функцию fullSetProperty
# в указать параметрам имена изображений в main.xml
# например android:background="@+id/drawable/имя изображения"
# но у меня этот вариант не работает
droid.fullSetProperty("cloth", "background", "file:///%s/res/drawable/background_programm.png"%(full_path))
# иконка на кнопке внизу справа
droid.fullSetProperty("buttonClose", "background", "file:///%s/res/drawable/exit.png"%(full_path))
# иконка на кнопке внизу слева
droid.fullSetProperty("buttonInfo", "background", "file:///%s/res/drawable/info.png"%(full_path))
# иконка на кнопке внизу в центре
droid.fullSetProperty("buttonStart", "background", "file:///%s/res/drawable/start.png"%(full_path))

while True:
signal = droid.eventWait().result
# событие по нажатию кнопки "Exit" в меню
if signal == "Exit":
sys.exit()
# событие по нажатию на левую "софт-клавишу"
elif signal == "click":
if signal == "buttonInfo":
droidInterface.query(title="О программе:", message=open("%s/res/data/info.txt" %(full_path)).read())
# событие по нажатию на правую "софт-клавишу"
elif signal == "buttonClose":
sys.exit()
# событие по нажатию на центральную "софт-клавишу"
elif signal == "buttonStart":
text = droidInterface.input_text(message="Введите текст:", title="Full Image")
# печать текста
if text != None:
string = ""
for item in text:
string += item
droid.fullSetProperty("TextView", "text", string)


Вот, в принципе, и все. Из нового в этой статье было только добавление графики к виджетам Android. Ну, а тем, кто пока еще не в курсе, советую почитать первую и вторую части статьи. Вот проект fullImage.zip - 115.98 Kb За сим разрешите откланяться, Adios, amigos!

Автор: Иванов Юрий.
HeaTTheatR
Создание и управление интерфейсом на Android с Python. ЧАСТЬ 3.

СОЗДАНИЕ И УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ НА ANDROID С PYTHON. ЧАСТЬ 3.
Buenos dias! Сегодня, как и обещал, мы попробуем немного раскрасить наш интерфейс с помощью картинок. А именно: добавим к нашему...

подробнее
Программирование для смартфонов
Thu, 14 Feb 2013 08:38:36 +0400Создание и управление интерфейсом на Android с Python. Часть 2



Доброго времени суток!
Хотелось бы продолжить разговор о программировании и управлении элементами интерфейса на Андроид средствами Питон. В этой статье я не буду описывать то, о чем уже говорилось в предыдущей. Для тех, кто читает эту статью впервые, будет полезно ознакомится с Создание и управление интерфейсом на Android с Python. Часть 1. А для работы в этот раз нам с вами понадобится вот это версия оболочки droidinterface. Модули для Python на Android находятся по пути /sdcard/com.googlecode.pythonforandroid/extras/python. Также я буду придерживаться стандартной архитектуры расположения папок и файлов в приложении (см. первую часть статьи).

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

Вот, что у нас должно получится:



Итак, не будем тянуть Андроид за антенны, а сразу начнем! Вот наш xml:

main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#cccccc"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="fill_parent"
android:layout_height="40dp"
android:text="Demo Text Editor"
android:gravity="center"
android:textColor="#000000"/>
<EditText
android:id="@+id/edit_txt"
android:layout_width = "fill_parent"
android:layout_height="fill_parent"
android:text = "
Пример программы
Текстовый Редактор
для Android

Демонстрационная программа, реализует меню, ввод, правку и сохранение текста. Также представленны функции для работы с цветом текстового поля, размером и стилем шрифта

Автор: Иванов Юрий (HeaTTheatR)
Тест: HTC WildFire

Специально для сайта dimonvideo.ru"
android:textSize="20dp"
android:background="#000000"
android:textColor="#ffffff"
android:gravity="center"
/>
</LinearLayout>


Сценарий на Python



# demo.py

# -*- coding: utf-8 -*-

import os
import sys

import droidInterface

# флаг говорит, что текстовое поле
# не очищено от информационной заставики
edit_flag = True
droid = droidInterface.droid
# имена иконок оставляю пустыни
# так как у меня их всего шесть
# и ни одна по своему значению
# не подходит к нашим пунктам меню
# поэтому пункты будут содержать только названия
droidInterface.set_menu()

droid.fullShow(open("%s/res/layout/main.xml" %(os.path.dirname(__file__))).read())

#______________________
#
# ФУНКЦИОНАЛ ПРОГРАММЫ
#______________________
#


# поскольку вызовы функции по событиям
# "Цвет фона-Цвет шрифта-Размер шрифта"
# отличаются только входными параметрами
# я не стал писать три идентичные функции
# и обошелся одной
def setPropertyMainEditor(list_items=, list_values=, property="", id="", title="", toast=""):
"""
Функция изменяет свойства виджетов графического интерфейса.

аргумент list_items - это список пунктов в окошке для выбора пользователем нужного значения;

аргумент list_values - это значения для свойств виджетов:
цвета фона, цвет шрифта, размер шрифта

аргумент property - свойство виджета: background, textColor, textSize

аргумент id - id виджета, в общем случае это "edit_txt"
"""
try:
# создаем окно со списком для выбора одного элемента
result = droidInterface.selection_list(selection_list=list_items, title=title)
if result != None:
droid.fullSetProperty(id, property, list_values)
droidInterface.note(toast)
except Exception, exc:
droidInterface.note(str(exc))

while True:
signal = droid.eventWait().result
# проверяем тип нажатия на принадлежность к событиям меню
if signal == u"Выход":
sys.exit()
elif signal == u"Цвет фона":
setPropertyMainEditor(list_items=,
list_values=,
property="background",
id="edit_txt",
title="Выберете цвет:",
toast="Цвет установлен")
elif signal == u"Цвет шрифта":
setPropertyMainEditor(list_items=,
list_values=,
property="textColor",
id="edit_txt",
title="Выберете цвет:",
toast="Цвет установлен!")
elif signal == u"Размер шрифта":
setPropertyMainEditor(list_items=,
list_values=,
property="textSize", id="edit_txt",
title="Размер шрифта:", toast="Размер установлен!")
elif signal == u"Сохранить текст":
# функция возвращает словарь с информацией о виджете
# нас интересует значение с ключом "name" - содержимое виджета
# функция в качестве аргумента принимает id виджета
text = droid.fullQueryDetail("edit_txt").result
file_name = droidInterface.input_text("Сохранить", "Имя файла:")
if file_name != None:
open("%s/%s%s" %(os.path.dirname(__file__), file_name, ".txt"), "w").write(text.encode("u8"))
droidInterface.note("Файл сохранен!")
# нажат один из виджетов
elif signal == "click":
# выясняем по id какой именно
if signal == "edit_txt":
# этот флаг описан в самом начале
if edit_flag:
# очищаем и выравниваем ввод текста по левому краю
droid.fullSetProperty("edit_txt", "text", "")
droid.fullSetProperty("edit_txt", "gravity", "left")
# устанавливаем новое значение
# чтобы впоследствии
# можно было теребить пальцем по экрану
# без последующей его очистки
edit_flag = False




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

Автор Иванов Юрий (HeaTTheatR)
HeaTTheatR
Создание и управление интерфейсом на Android с Python. Часть 2.

Создание и управление интерфейсом на Android с Python. Часть 2
Доброго времени суток!
Хотелось бы продолжить разговор о программировании и управлении элементами интерфейса на Андроид...

подробнее
Программирование для смартфонов
Tue, 12 Feb 2013 16:23:31 +0400Добрый день.
Хотел бы предоставить на ваш суд свою первую статью о программировании на Python под Android. Сразу оговорюсь, что я не специалист в этой области, учусь вместе с вами. Как и многие из нас, начинал писать приложения на старой доброй OS Symbian. Однако прогресс не стоит на месте, и на смену старому всегда приходит новое. Вот с этим новым мне и пришлось столкнуться, когда я приобрел HTC Wildfire на платформе Android...
Разобравшись с новым устройством, я решил, что, наконец, пришло время установить полюбившийся многим интерпретатор языка программирования Python.
В Интернете наткнулся на SL4A (Scripting Layer For Android) - оболочку, которая, позволяет создавать и запускать скрипы,
написанные на различных языках
сценариев (Python, Perl, Ruby, Lua, BeanShell, javascript и Tcl) прямо на Android - устройствах. Описывать работу с этой оболочкой я не буду, поскольку ниже есть ссылка на соответствующую статью от "Питон на Android. Начало".
Наверное, ни для кого не секрет, что "родные" приложения для Android пишутся на Java (не путайте с платформой Java2ME). Так вот, сценарии, написанные с помощью SL4A, имеют доступ ко многим API, доступным для нормального Java приложения, но с упрощенным интерфейсом...
Установил, проверил, стало грустно. Потому что, если на Symbian Python был чуть ли не всемогущ, и зачастую приложение, написанное на нем, не уступало аналогам на Си, то на Android, сделать что-то большее, чем общение с пользователем посредством диалоговых окон или запуск скрипра в фоновом режиме, увы, не удастся. С другой стороны мы имеем модуль android, который позволяет программисту создавать все те же диалоговые окна, selection list, вызывать прогресс бар, отправлять/читать сообщения и многое другое. То есть с его помощью мы имеем доступ практически ко всем необходимым для разработки приложения функциям смартфона. Но! Мы не имеем возможности создать более менее приличный интерфейс к нашим приложениям. К счастью, все это заблуждение!
На платформе Android Python-программист имеет возможность создавать интерфейс пользователя двумя способами. Первый - с помощью функции из модуля android webViewShow, которой в качестве аргумента передается строка, путь к html-документу, который и будет интерфейсом приложения. Все события такого приложения будут передоваться в Python-сценарий с помощью кода на Java-script в html-странице интерфейса приложения. Подробнее о webViewShow можно прочитать в статье от пользователя Zaterehniy Питон на Android. Начало. Однако должен сказать, что у этого способа создания интерфейса есть огромный минус - html перестает отвечать на действия пользователя буквально после нескольких обработанных событий. Увы, но это так. К счастью у нас есть второй, на 100% действенный, способ
создания пользовательского
интерфейса — fullScreenUI.
Начиная с версии SL4A_r5, появился новый, как заявили разработчики, пока что
экспериментальный, способ создания пользовательского интерфейса — fullScreenUI. FullScreenUI позволяет создавать интерфейс, используя стандартные виджеты Android (кнопки,
текстовые поля, радиокнопки, и
проч.), а также обрабатывать события от них.
Весь интерфейс нашего приложения, как и в "родной" программе на Java, будет описан в xml-макете, код же самого сценария будет записан в отдельном файле. Android-разработчики используют два определения термина «макет». Первое — тип ресурса, определяющий то, что будет на экране. Макеты хранятся в виде xml-файлов в /res/layout директории приложения. Второе определение: макет - это просто шаблон для экрана пользовательского интерфейса, компановка тех или иных элементов, которые будет видеть пользователь.
В xml-контейнере мы лепим визуальную часть приложения: здесь будет текстовое поле, оно будет черного цвета, внизу будет кнопка с надписью "Сохранить", она будет зеленого цвета и так далее. На самом деле это очень удобно, поскольку мы отделяем интерфейс от кода нашей программы. В этой статье я не буду вдаваться в подробности xml разметки на Android, а всего лишь покажу как управлять этими елементами из сценария на языке Python.
Более подробно об xml разметке на Android вы можете прочитать здесь.
Все примеры, которые я приведу в этой статье, используют droidInterface.py - оболочку для работы с модулем android. Оболочку я пишу для себя, потому что мне так проще, это не конечный результат, и если вы не испытываете затруднений с использованием модуля android, она вам не нужна, перепишите примеры под оригинальный API.
Итак, начнем. Все сценарии у меня лежат в /sdcard/sl4a/scripts/ExampleUI. У вас они могут находится где угодно. Создадим папку нашего первого примера. Назовем ее Example. В этой папке создайте папку ресурсов res, в которой будет подпапка layout. Я всегда придерживаюсь данной структуры приложения, чего и вам советую. В итоге у вас должна получится директория /sdcard/sl4a/scripts/Exampe/res/layout . В корне проекта будет находится наш Python-сценарий, demo.py, а в папке layout файл макета интерфейса main.xml с нижеследующим содержанием:

main.xml


<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout
android:layout_width = "fill_parent"
android:layout_height= "fill_parent"
android:orientation ="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width= "wrap_content"
android:layout_height="wrap_content"
android:text = "Button 1"/>
<Button
android:layout_width= "wrap_content"
android:layout_height="wrap_content"
android:text = "Button 2"/>
<Button
android:layout_width= "wrap_content"
android:layout_height="wrap_content"
android:text = "Button 3"/>
</LinearLayout>


А вот сам Python сценарий:


# demo.py
import sys
import os

import droidInterface

droid = droidInterface.droid
fullway = os.path.dirname(__file__)

droidInterface.set_menu()

droid.fullShow(open("%s/res/layout/main.xml"%(fullway)).read())

while True:
event = droid.eventWait().result
if event == "Exit":
sys.exit()
else:
droidInterface.note(str(event))


Вот, что у нас получилось:



Теперь немного о самом коде...

import droidInterface - оболочка для работы с модулем android.

droid = droidInterface.droid - переменной droid присваиваем экземпляр класса Android, который определен в модуле droidInterface; через droid мы будем работать со стандартным API.

fullway = os.path.dirname(__file__) - получаем полный путь к папке с нашим сценарием.

droidInterface.set_menu() - вешаем на кнопку "menu" наше меню ;первый аргумент - название пункта, второй - имя используемой иконки; если мы хотим меню из нескольких пунктов, тогда нам нужно передать в функцию set_menu список кортежей: droidInterface.set_menu()

droid.fullShow(open("%s/res/layout/main.xml"%(fullway)).read()) - думаю здесь понятно, метод fullShow принимает строку с нашим макетом интерфейса;


while True:
event = droid.eventWait().result - функция droid.eventWait останавливает сценарий и ждет действий от со стороны пользователя; результатом выполнения (переменная event) будет ассоциативный массив с именем события и информацией о нем;


if event == "Exit":
sys.exit() - для начала проверяем значение event, если оно равно "key", то была нажата кнопка, код
которой можно узнать из event ; если же оно равно
"click", то было нажатия на один из виджетов, id которого можно узнать из event ; посмотрите содержимое появляющегося окошка, проанализируйте...

Теперь давайте попробуем динамически изменить наш интерфейс.

main.xml


<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello SL4A full
screen UI!"/>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ok"/>
</LinearLayout>


Сценарий:


# demo.py
import os
import sys

import droidInterface

droid = droidInterface.droid

droidInterface.set_menu()

droid.fullShow(open("%s/res/layout/layout.xml" %(os.path.dirname(__file__))).read())

while True:
event = droid.eventWait().result
if event == "Exit":
sys.exit()
elif event == "click":
if event == "button":
# изменяем вид интерфейса
droid.fullSetProperty("editText", "text", "properties edited!")
droid.fullSetProperty("background",
"backgroundColor", "0xff7f0000")


Вот, что у нас получилось:



Теперь если мы нажмем на кнопку "Ok", наш интерфейс динамически поменяет свой облик:



Динамически изменять элементы графического интерфейса и содержание форм мы можем с помощью метода droid.fullSetProperty, который принимает три параметра: id виджета, название свойства, присваиваемое значение.
id виджета. Находится в файле main.xml и задается программистом. Например форме для ввода текста <EditText> мы присвоили id - android:id="@+id/editText".
Название свойства. Это может быть, например, текст в форме или имя кнопки. Заметьте, что изначально в форме <EditText> мы не указывали свойство "text" (android:text="properties edited")
Присваиваемое значение. Тут, думаю, все понятно. Это может быть новое имя пункта, список Listbox, цвет фона и т.д.
Так, если бы мы захотели динамически изменить и имя кнопки на, скажем, "New Name", то должны были добавить в условие строчку droid.fullSetProperty("button",
"text", "NEW NAME")

На этом все. Основные принципы, думаю, понятны. Если кому-то помогла это статья, пишите, выложу еще. И оставляйте комментарии, потому что мы учимся вместе
HeaTTheatR
Создание и управление интерфейсом на Android с помощью Python

Добрый день.
Хотел бы предоставить на ваш суд свою первую статью о программировании на Python под Android. Сразу оговорюсь, что я не специалист в этой области, учусь вместе с вами. Как и...

подробнее
Программирование для смартфонов
Sun, 23 Sep 2012 10:44:19 +0400здравствуйте. Тут мы разберем, как и когда надо кодировать файлы при программировании на питоне.
Русский текст
Если вы сохраняете файл в unicode и при этом есть русский текст, то его оформляют в виде строк unicode.
Посмотреть, как оформлять русский текст в юникоде можно в консоли набрав:
Print "русский текст"
Вам выдаст строки.
А если вы работаете с кодировкой utf-8 то вам будет куда удобние. Для декодирования русского текста в utf-8 в начале програмы наберите:
Def ru(x): return x.decode('utf-8')
А русский текст пишем например так:
Appuifw.note(ru(сегодня я дома))
Так писать куда удообнее.
Если будут проблемы с кодировкой, то в начале проги импортируйте модуль sys и выполните такую команду:
Если вы еще не импортировали данный модуль, то напишите:
Import sys
А ниже команду:
Sys.setdefaultencoding('utf-8')
Так плавно мы подошли к кодированию например текста для шифрования.
Метод encode для кодирования, а decode для декодирования.
эти методы не могут просто висеть где попало, а пишутся так:
Def encode(x):
Return x.encode('base64')
Print (decode(felix))
Кодируем имя феликс в шифр.
Ну тут я остановлюсь т.к. Об этом можно говорить сотни лет, например отправлять данные в буфер обмена в шифр.виде доставать и разкодировать.
Остальное читайте в инете, а азы я объяснил.
Felix.potter
Кодирование в питоне

здравствуйте. Тут мы разберем, как и когда надо кодировать файлы при программировании на питоне.
Русский текст
Если вы сохраняете файл в unicode и при этом есть русский текст, то его...

подробнее
Программирование для смартфонов
Tue, 24 Apr 2012 23:29:15 +0400Добрый день.

Все мы (ну или почти все) когда-то пользовались смартфонами под управлением ОС Symbian. Многим из нас не хватало функционала уже существующего ПО, и тогда на смартфоне появлялся Python и множество самописных программ на нём же. Такие программы назывались скриптами, а написать скрипт мог любой желающий, вооружившись одним лишь текстовым редактором.

Теперь же многие из нас обзавелись смартфонами, управляемыми ОС Android, которая, как известно, создана на базе ядра Linux.
А одной из отличительных особенностей GNU/Linux является bash — одна из наиболее популярных современных разновидностей командной оболочки UNIX.

Цитата: Advanced Bash-Scripting GuideShell — это командная оболочка. Но это не просто промежуточное звено между пользователем и операционой системой, это еще и мощный язык программирования. Программы на языке shell называют сценариями, или скриптами. Фактически, из скриптов доступен полный набор команд, утилит и программ Unix. Если этого недостаточно, то к вашим услугам внутренние команды shell — условные операторы, операторы циклов и пр., которые увеличивают мощь и гибкость сценариев. Shell-скрипты исключительно хороши при программировании задач администрирования системы и др., которые не требуют для своего создания полновесных языков программирования.

Вооружаемся всем необходимым:
во-первых, нам нужно получить права пользователя root;
во-вторых, нам нужен эмулятор терминала — этот (требует Android 1.5+) или любой другой;
в-третьих, нам нужен BusyBox — набор UNIX-утилит командной строки — этот (требует Android 1.6+) или любой другой;
в-четвёртых, нам пригодится текстовый редактор — этот (требует Android 1.6+) или любой другой.
Опционально можно поставить модифицированный bash , положив его в /system/bin/.

Итак, весь необходимый софт установлен. Запустив эмулятор терминала, попробуем выполнить какую-нибудь команду, например, посмотрим информацию о системе:
sh-4.1$ uname -a
Linux localhost 2.6.35.7-CL709629 #10 PREEMPT Fri Apr 13 18:06:10 IST 2012 armv7l GNU/Linux
Особой пользы нам эта команда не принесла, попробуем выполнить что-нибудь более полезное.

Подробнее о командах вы можете узнать, например, в том же самом Advanced Bash-Scripting Guide или спросить у наших линуксоидов .

Наверное, сейчас нам пригодится новый пароль из, допустим, 30 случайно взятых символов (букв, цифр и знаков препинания):
sh-4.1$ tr -cd \'+\' < /dev/urandom | fold -w30 | head -n1
{EMn!v\'u<AqcAH\'YD/U6bQ?>dS!W^d Скриншот

Как вы уже догадались, довольно неудобно каждый раз вводить в терминале такую команду. Поэтому, чуть-чуть изменив текст, мы создадим скрипт, который генерирует пароль указанной пользователем длины и НВПС сохраняет его в текстовый файл:
#!/system/bin/bash

tr -cd \'+\' < /dev/urandom | fold -w $1 | head -n1 > /sd/pwd.txt
echo "Check /mnt/sdcard/external_sd/pwd.txt" Скриншот

Скрипт написан и сохранён. Пытаемся его выполнить, но результат не радует:
sh-4.1$ /sd/pwg.sh 15
sh: /sd/pwg.sh: Permission denied
А всё потому, что у нас карта памяти отформатирована в файловой системе FAT. (Есть предположение, что на носителе с файловой системой ext4 всё заработает искаропки). Посему кладём наш скрипт в
/system/xbin/, не забыв после этого разрешить системе его выполнение командой
chmod 777 /system/xbin/pwg.shили с помощью вашего любимого файл-менеджера.

Запускаем скрипт:
sh-4.1$ pwg.sh 50
Check /mnt/sdcard/external_sd/pwd.txt Скриншот

Всё работает, задача выполнена.

 Скриншот

Бонус: можно заставить систему выполнять скрипт при загрузке, о чём подробнее написано здесь .

The End.
DimonVideo
Bash-скриптинг на устройствах под управлением ОС Android: первые шаги

Добрый день.
Все мы (ну или почти все) когда-то пользовались смартфонами под управлением ОС Symbian. Многим из нас не хватало функционала уже существующего ПО, и тогда на смартфоне появлялся...

подробнее
Программирование для смартфонов
Sun, 18 Mar 2012 15:00:14 +0400Искал способ как запаковать свой собственый проект на python в apk файл, без помощи пк и вот наконец- таки такая возможность появилась. Об этом собственно и поговорим в данной статье.

содержание:

вступление
1.что для этого необходимо. Подготавливаем проект.
2.Структура проекта. Пакуем наше приложение в apk файл.

Положение дел.

Благодаря стараниям отечественных и зарубежных разработчиков, на андроиде появилась возможность писать и собирать свои проекты на java прямо на смартфоне. Все это благодаря интегрированной среде разработки. В небольшой срок появились и начали активно развиваться несколько интересных проектов. Коротко расскажу о двух из них. Первым привлекшим мое внимание стал проект anjedi. В отличии от предыдущих попыток в данной програме был реализован удобный интерфейс, навигация по проекту и все необходимые инструменты для быстрой запаковки и тестирования собранного приложения. Позднее случайно наткнулся на aide в маркете. Данная ide отличалась двухоконным интерфейсом, автодополнением и лог ошибок. Так как в свободное время писал на питоне используя sl4a мне стало интересно возможно ли собрать собственный проект на смартфоне. Стал копать в этом направлении.
Как вообще собрать приложение написанное на python для андроида ? На официальном сайте описывается способ запаковки. Качаем шаблон программы, в Eclipse создаем новый проект из готового исходника открываем скрипт и заменяем его содержание своим кодом. Собираем проект, получаем готовый апк, переносим на смартфон любым способом, устанавливаем, запускаем и наблюдаем работу приложения(не зыбываем установить питон и компоненты).
В первых версиях anjedi не было возможности паковать сторонние проекты не созданные в самой программе. Такая поддержка появилась недавно. Тогда то я и начал от версии к версии тестировать на предмет сборки шаблона на питоне. Однако никак не получалось скомпилировать. На 40% сборки приложение зависает а через несколько минут закрывается с ошибкой. Пока что с помощью anjedi не палучается собрать, по крайней мере у меня. Отписал разрабу может в дельнейшем поправят.
В последней версии aide 1.0 beta9 так же появилась возможность собирать проекты со стандартной структурой. Первым делом попробовал собрать шаблон и вот все получилось.

что нам понадобится

-Для начала установим sl4a и python. Этот пункт я описывал в своей статье -питон на андроид. начало и стандартный шаблон Cсылка
-далее установим aide. Начиная с версии 1.0 beta9 поддерживается запаковка любых проектов для андроид.
-файловый менеджер. Я использую Total comander и root explorer.
-текстовый редактор. Встроенный в aide редактор тормозит при открытии больших файлов, поэтому предлогаю пользоваться сторонним. Посоветовать могу 920 text editor . Автоопределение кодировок, шустрый, удобный редактор с подсветкой синтаксиса.

когда все установлено можно приступать к работе. Для начала напишем к примеру простенькую программу на питон используя sl4a. После того скачаем шаблон для упаковки нашего будущего проекта. распакуем архив и папку с исходниками положим по пути sdcard/AppProjects/ .В этой папке по умолчанию располагаются проекты для работы с ними в нашей ide. Рассмотрим структуру проекта подробнее.

Программа содержит все необходимое для работы питон скрипта. Дополнительные библиотеки, описание элементов интерфейса в xml, java код . Остановлюсь на том что пригодится нам.
 скриншот
папка res : в тут располагаются ресурсы программы, иконка и логотип проекта, сам питон скрипт, xml с описанием некоторых элементов интерфейса. В корне папки располагаются 4 папки.
 скриншот
1. drawable/
 скриншот
-icon.png - иконка программы которая будет отображаться в меню. можно заменить на свою.
-script_logo_48.png - логотип программы. Будет отображаться в статус баре когда программа запущена. так же можно заменить на свой.
-stat_sys_warning.png - иконка отображающаяся в статус-баре если во время работы программы возникла ошибка (код ошибки отображается рядом в строке).
2. layout/
 скриншот
- dialog.xml - в этом файле описывается вид строки в статус-баре появляющейся при запуске программы. Тут мы ничего трогать не будем.
- main.xml - содержание строки в статус баре. Тут тоже трогать ничего не будем.
3. raw/
 скриншот
-script.py - рабочий скрипт нашего приложения. В нем содержится весь исходный код питон части нашего приложения. Заменим имеющийся в скрипте код на свой.
4. values/
 скриншот
-strings.xml - тут нас интересуют две строки .
тут пишем название нашего приложения которое будет отображаться в списке установленных приложений
пишем текст который будет отображаться в статус баре при загрузке приложения
с данной папкой разобрались идем дальше. Возвращаемся в корневой каталог.
 скриншот
SRC/ тут располагается java часть программы. Взглянем на путь по которому лежат файлы - com/dummy/foofoandroid/ - этот путь и есть название пакета нашего проекта - com.dummy.fooforandroid. То есть если мы запакуем два разных проекта с одним и тем же названием то программы будут устанавливаться друг на друга заменяя собой предыдущую версию. Поэтому нам необходимо будет переименовать эти папки и заменить несколько строк в .java файлах. Переименуем например в com.test.app. откроем последнюю папку, в ней лежат 5 файлов, их мы слегка и будем редактировать. Откроем dialogactivity.java в любом текстовом редакторе, смотрим первую строчку - package com.dummy.fooforandroid; меняем выделенное на com.test.app. сохраняем и закрываем файл. То же самое делаем и с остальными четыремя файлами. Т.е меняем название пакета на свое.
сохраняем все и возвращаемся обратно в корневой каталог. находим там файл androidmanifest.xml, в нем так же меняем название. Собственно и все, можно собирать проект.
 скриншот


Сборка проекта
 скриншот

запускаем ide. В панеле файлов видим папку с нашим проектом, нам нужно открыть проект . для этого необходимо открыть любой файл. Например манифест. появится окно уведомления о том что наш проект открыт. Нажимаем клавишу меню в нем выбираем пункт \"run\" . Начнется компиляция и сборка. По завершению которой программа установится на телефон и мы можем запустить ее, проверить работу. Готовый апк файл располагается по пути папка с нашим проектом/bin/ . Вот о чем хотел собственно рассказать в данной статье. Спасибо за внимание, успехов вам в ваших начинаниях.
Zaterehniy
Запаковка проекта на Python для Android на самом смартфоне.

Искал способ как запаковать свой собственый проект на python в apk файл, без помощи пк и вот наконец- таки такая возможность появилась. Об этом собственно и поговорим в данной статье.

подробнее

Напомнить пароль

Яндекс.Метрика