ã¯ããã«
ãã®èšäºã§ã¯ãUbuntuãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®Pythonã§FTPãããã³ã«ã䜿çšããŠãã¡ã€ã«ãåæãããµã³ãã«ããã°ã©ã ã䜿çšããŠãSL4Aã䜿çšããŠããã°ã©ã ãäœæããããã»ã¹ã«ã€ããŠèª¬æããŸãã SL4Aã¢ããªã±ãŒã·ã§ã³ã®éçºã®ããã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ§æã瀺ããã¢ããªã±ãŒã·ã§ã³èªäœãèšè¿°ããããŒã³ãŒãã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãé åžããã¢ããªã±ãŒã·ã§ã³ã.apkãã¡ã€ã«ã«ããã±ãŒãžåããŸãã
SL4Aãšã¯äœããäœãšäžç·ã«é£ã¹ããããã«ã€ããŠã®ããã€ãã®èšè
Damon KohlerãšGoogleãæäŸãã20ïŒ ã®èªç±æéã®ãããã§çãŸããSL4AïŒScripting Layer for AndroidïŒãããžã§ã¯ãã«ãããããŸããŸãªã€ã³ã¿ãŒããªã¿ãŒåããã°ã©ãã³ã°èšèªïŒçŸåšã¯PythonãPerlã JRubyãLuaãBeanShellãJavaScriptãTclãããã³ShellïŒã
SL4Aã«ã€ããŠã¯ãã§ã«habrã«æžãããŠããŸãã ããšãã°ãããã®ã«ã«ãããã§ãã¯ããããã«Pythonã§ã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããã ããã§ã¯ ãLuaã䜿çšããŠãå€éã«é»è©±éä¿¡ãåæããã¹ã¯ãªãããäœæãããŸããã
SL4Aã¯ãããã°ã©ãã³ã°ã®æè²ãããã°ã©ã ã®ãããã¿ã€ãã®äœæãAndroidãã©ãããã©ãŒã ã§ã®ã¢ã¯ã·ã§ã³ã®èªååã¿ã¹ã¯ã®è§£æ±ºã«æé©ã§ãã 倧ãããŠæ·±å»ãªããã°ã©ã ã¯SL4Aã§äœæãããŠããŸããããããããã°ã©ã ã®äœæã«ã¯é©ããŠããŸãã ããã®ã«ã«ãã確èªãã劻ã«SMSãéä¿¡ããŠãèªå® ããæ°ããé¢ãããšããã§å€é£ã®æºåãå§ããããã«é Œã¿ãŸãã ç®çã®é§ ã«è¿ã¥ãããšãã«é»è»ã§ç®èŠããããå®éã®ãã±ãããå¶åŸ¡ãããããããšããSL4Aã䜿çšããŠæå°éã®ã³ãŒããšæéã§å®çŸã§ããŸãã
æ¯èŒã®ããã«ãJavaãšPythonã®æãåçŽãªããã°ã©ã ã以äžã«ç€ºããŸãïŒ PyCon 2011ãã¬ãŒã³ããŒã·ã§ã³ããåãããäŸïŒïŒ
package com.spodon.pycon; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.widget.EditText; import android.widget.Toast; public class Demo extends Activity { private EditText mEditText = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Hello!"); builder.setMessage("What is your name?"); mEditText = new EditText(this); builder.setView(mEditText); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(Demo.this, "Cancelled", Toast.LENGTH_SHORT).show(); } }); ...
åãPythonããã°ã©ã ã¯4è¡ïŒïŒïŒã ããåããŸãïŒ
import android droid = android.Android() name = droid.getInput("Hello!", "What is your name?") droid.makeToast("Hello, %s" % name.result)
圌ããèšãããã«ãéãã¯æããã§ãã ãã¡ãããæ¬ é¥ããªããã°ã§ããŸããã èšäºã®æåŸã§ãããã«ã€ããŠã
æ¬äœ
é»è©±æ©ã«SL4Aãã€ã³ã¹ããŒã«ããŸã
ããã§ã¯ãåæã¢ããªã±ãŒã·ã§ã³èªäœã®äœæãå§ããŸãããã
SL4Aã䜿çšããã«ã¯ãæºåž¯é»è©±ã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ãããŸãã¯ããŒã³ãŒãããååŸã§ããŸãã
SL4Aã¢ããªã±ãŒã·ã§ã³ã«ã¯çŽæ¥ãã·ã§ã«ã€ã³ã¿ãŒããªã¿ãŒã®ã¿ããããŸãã ä»ã®ããã°ã©ãã³ã°èšèªã䜿çšããã«ã¯ãè¿œå ã®ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã Pythonã€ã³ã¿ãŒããªã¿ãŒã¯ãã¡ãã§ãã
SL4Aã䜿çšããããã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ããã¢ãã
ãã¡ã€ã«åæã¢ããªã±ãŒã·ã§ã³ãæ©èœãããã«ã¯ãã³ã³ãã¥ãŒã¿ãŒã«ftpãµãŒããŒãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã Ubuntuã«ã¯vsftpdã¢ããªã±ãŒã·ã§ã³ããããããã¯ç¡æã§ç°¡åã«èšå®ã§ããftpãµãŒããŒã§ãã ã€ã³ã¹ããŒã«ããã«ã¯ãã¿ãŒããã«ã§ã³ãã³ããå ¥åããã ãã§ãïŒ
sudo apt-get install vsftpd
ãµãŒããŒèšå®ãã¡ã€ã«ã¯/etc/vsftpd.confã«ãããŸãããã¡ã€ã«ã®æžã蟌ã¿èš±å¯ãè¿œå ããŠãè¡ã®ã³ã¡ã³ãã解é€ããå¿ èŠããããŸãã
#write_enable=YES
ãµãŒããŒãåèµ·åããŸãã
$sudo service vsftpd restart
SL4Aã¢ããªã±ãŒã·ã§ã³ã¯é»è©±ã§çŽæ¥äœæã§ããŸãããä»®æ³ããŒããŒãã§ã³ãŒããå ¥åããã¿ã¹ã¯ã¯ãå°ããªã¢ããªã±ãŒã·ã§ã³ã§ãéåžžã«ç²ããã®ã§ãã³ã³ãã¥ãŒã¿ãŒã§ã¢ããªã±ãŒã·ã§ã³ãäœæããŠé»è©±ã«ã¢ããããŒãããæ¹ãã¯ããã«äŸ¿å©ã§ãã
ã³ã³ãã¥ãŒã¿ãŒã§æžãããSL4Aã¢ããªã±ãŒã·ã§ã³ãéå§ããã«ã¯ããŸãé»è©±ã§SL4AãµãŒããŒãéå§ããå¿ èŠããããŸãïŒSL4Aã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ããŒãžã§ã[ã¡ãã¥ãŒ]-[ã€ã³ã¿ãŒããªã¿ãŒ]-[ã¡ãã¥ãŒ]-[ãµãŒããŒã®éå§]ãæŒããŸãïŒã ãã©ã€ããŒããµãŒããŒãèµ·åããŸãã ãµãŒããŒãå®è¡ãããŠãããšããéç¥ã衚瀺ããããµãŒããŒã䜿çšããããŒãã瀺ãããŸãã
ã³ã¡ã³ãïŒãããªãã¯ãµãŒããŒãèµ·åããéžæè¢ããããŸãã ãããªãã¯ãµãŒããŒãèµ·åãããšãIPã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ã§ãã人ã¯ã ãã§ãé»è©±ãå¶åŸ¡ã§ããŸãã ãã©ã€ããŒããµãŒããŒãèµ·åãã以äžã«ç€ºãããã«ç°å¢å€æ°ãèšå®ãããšãã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããã¹ã¯ãªããã¯ãé»è©±ã§å€æŽãªãã§æ©èœããŸãã ãã©ã€ããŒããµãŒããŒãæ©èœããã«ã¯ã Android SDKãã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããŸãã
ããŒã9999ã«çä¿¡ãããã¹ãŠã®ããŒã«ã«ãã©ãã£ãã¯ãAndroidããã€ã¹ã«ãªãã€ã¬ã¯ãããŸãïŒãµãŒããŒãããŒã46136ã§ãªãã¹ã³ããŠãããšä»®å®ããŸãïŒã
$ adb forward tcp:9999 tcp:46136
ç°å¢å€æ°ãäœæããã»ããã¢ãããå®äºããŸãã
$ AP_PORT=9999
android.pyãã¡ã€ã«ãPythonã©ã€ãã©ãªãã©ã«ããŒã«è¿œå ããã ãã§ããããã§ãã³ã³ãã¥ãŒã¿ãŒã§ã¢ããªã±ãŒã·ã§ã³ãäœæããŠå®è¡ããçµæãããã«é»è©±ã§èŠãããšãã§ããŸãã Androidããã€ã¹ã§helloWorldãå®è¡ããã«ã¯ãPythonã€ã³ã¿ãŒããªã¿ãŒã«å ¥åããã ãã§ãã
>>>import android >>>droid = android.Android() >>>droid.makeToast("Hello, world!")
æåã®è¡ã§ã¯ãAndroidã©ã€ãã©ãªãã€ã³ããŒãããã次ã«Android APIã䜿çšãããdroidãªããžã§ã¯ããäœæãããŸãã æåŸã®è¡ã«ã¯ãããã€ã¹ç»é¢ã«ãHelloãWorldïŒããšããã¡ãã»ãŒãžã衚瀺ãããŸãã
ããã§ãSL4AãæäŸããAPIã詳ããèŠãŠã¿ãŸãããã
ããã°ã©ã ãœãŒã¹ã³ãŒã
ãã®ããã°ã©ã ã¯ãAndroidããã€ã¹äžã®éžæãããã©ã«ããŒå ã®ãã¡ã€ã«ãšããã¯ã°ã©ãŠã³ãã§ã³ã³ãã¥ãŒã¿ãŒãåæããŸãã æ°ãããã¡ã€ã«ã®ç¢ºèªã¯30ç§ããšã«è¡ãããŸãã ããã°ã©ã ã®ã»ãšãã©ã¯ãåæ§ã®æ©èœãåããããŒãœãã«ã³ã³ãã¥ãŒã¿ãŒã¢ããªã±ãŒã·ã§ã³ãšã»ãšãã©å€ãããŸããã æ確ã«ããããã«ãäŸå€åŠçãçç¥ãããå Žåã
# -*- coding: utf-8 -*- import ftplib import time import os import android droid = android.Android() SERVER_IP = '192.168.0.101' USER = 'user' PASS = 'pass' REMOTE_FOLDER = 'sync' LOCAL_FOLDER = '/mnt/sdcard/sync' droid.makeToast("Started") if not os.path.exists(LOCAL_FOLDER): os.makedirs(LOCAL_FOLDER) while True: # server = ftplib.FTP(SERVER_IP) server.login(USER, PASS) # server.cwd(REMOTE_FOLDER) os.chdir(LOCAL_FOLDER) # remote_files = set(server.nlst()) local_files = set(os.listdir(os.curdir)) # for remote_file in remote_files - local_files: server.retrlines('RETR ' + remote_file, open(remote_file, 'w').write) # for local_file in local_files - remote_files: server.storbinary('STOR ' + local_file, open(local_file, 'r')) # 30 server.close() time.sleep(30)
æ¢ç¥ã®droid.makeToastïŒïŒã䜿çšãããšãåæã®é²è¡ç¶æ³ã«é¢ããã¡ãã»ãŒãžãAndroidããã€ã¹ã®ç»é¢ã«è¡šç€ºãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®èµ·å
ã¹ã¯ãªããã®ç·šéãå®äºãããã次ã®ã³ãã³ãã䜿çšããŠAndroidããã€ã¹ã«é 眮ã§ããŸãã
$ adb push ftp_sync.py /sdcard/sl4a/scripts
ã³ã³ãã¥ãŒã¿ãŒããã¹ã¯ãªãããå®è¡ããã«ã¯ãé»è©±ã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšã€ãªã¢ã¹ãäœæãããšäŸ¿å©ã§ãã ãããè¡ãã«ã¯ãè¡ãã/ .bashrcã«è¿œå ããŸãã
alias andrun='adb shell am start -a com.googlecode.android_scripting.action.LAUNCH_FOREGROUND_SCRIPT -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher -e com.googlecode.android_scripting.extra.SCRIPT_PATH'
次ã«ãã¹ã¯ãªããèªäœãã³ãã³ãã§å®è¡ã§ããŸã
andrun /mnt/sdcard/sl4a/scripts/ftp_sync.py
ã¢ããªã±ãŒã·ã§ã³é åž
ããŒã³ãŒãã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®é åž
å°ããªSL4Aã¢ããªã±ãŒã·ã§ã³ãé åžããç°¡åã§ç¬åµçãªæ¹æ³ã¯ãããŒã³ãŒãã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã転éããããšã§ãã ããšãã°ã ããã§ã¢ããªã±ãŒã·ã§ã³ã§ããŒã³ãŒããäœæã§ããŸãïŒã¿ã€ã-ããã¹ãããµã€ãº-LãéžæïŒã ãããã¢ããªã±ãŒã·ã§ã³ã®å€èŠ³ã§ãã
Androidããã€ã¹ã«ã¹ã¯ãªãããã€ã³ã¹ããŒã«ããã«ã¯ãSL4Aã¢ããªã±ãŒã·ã§ã³ãèµ·åããã¡ãã¥ãŒãæŒããŠ-è¿œå -ããŒã³ãŒããã¹ãã£ã³ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã.apkãã¡ã€ã«ã«ããã¯ãã
SL4Aã¹ã¯ãªããã¯ãéåžžã®.apkãã¡ã€ã«ã«ããã±ãŒãžåããããšãã§ããŸãã ãããè¡ãã«ã¯ãSL4Aãããžã§ã¯ããã³ãã¬ãŒããã¡ã€ã«ãããŠã³ããŒãããŠãEclipseã«ã€ã³ããŒãããŸãã äžæãªçç±ã«ããããããžã§ã¯ãããgenãã©ã«ããŒãæåã«æ¬ èœããŠããŸãã ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«æåã§äœæããå¿ èŠããããŸãã ãã®åŸãWindows-ç°å¢èšå®-Java-ãã«ããã¹-ã¯ã©ã¹å€æ°ã§ãAndroid SDKãã€ã³ã¹ããŒã«ããããã©ã«ããŒãæãANDROID_SDKå€æ°ãäœæããŸãã
次ã«ãres / rawãã©ã«ããŒã§ãscript.pyã®å 容ãããã°ã©ã ã®å 容ã«çœ®ãæããŸãã 次ã«ãã¡ãã¥ãŒã®[Project-Build]ãã¯ãªãã¯ããŸãããã¹ãŠãããŸããã£ãå Žåãã¢ããªã±ãŒã·ã§ã³ã.apkãã¡ã€ã«ã«ãã«ãããæºåãã§ããŠããŸãã [ãã¡ã€ã«]-[ãšã¯ã¹ããŒã]ã«ç§»åãã[Android]-[Androidã¢ããªã±ãŒã·ã§ã³ã®ãšã¯ã¹ããŒã]ãéžæããŠããããžã§ã¯ããéžæããŸãã
åAndroidã¢ããªã±ãŒã·ã§ã³ã«ã¯ããžã¿ã«çœ²åãå¿ èŠã§ãã 以åã«äœæãããŠããªãå Žåã¯ããã€ã¢ãã°ããã¯ã¹ã䜿çšããŠäœæããå¿ èŠããããŸãã æåŸã®ãã€ã¢ãã°ããã¯ã¹ã§ã¯ãäœæãã.apkãã¡ã€ã«ãä¿åããå Žæãå°ããããŸãã é»è©±ã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŸãã
$ adb install ftp_sync.apk
srcãã£ã¬ã¯ããªã§com.dummy.fooforandroidãéžæãã[ãªãã¡ã¯ã¿ãªã³ã°]ã¡ãã¥ãŒã®[ååã®å€æŽ]ãã¯ãªãã¯ãããšãã¹ã¯ãªããã®ååãå€æŽã§ããŸãã ååã«ã¯å°ãªããšã2ã€ã®ããªãªããå«ãŸããŠããå¿ èŠããããŸãã ãã®åŸãAndroidManifest.xmlã§ã¢ããªã±ãŒã·ã§ã³åãå€æŽããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ã¯res / drawableã«ãããŸãã å¿ èŠã«å¿ããŠãããããå€æŽã§ããŸãã
SL4Aã®GUIã¯ãHTMLããŒã¯ã¢ãããšwebViewã䜿çšããŠäœæãããŸãã ãã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãäœæããäŸã次ã«ç€ºããŸã ã
ãããã«
JavaãAndroidåãã®ã¢ãã€ã«éçºã«æ £ããŠããªã人åãã«SL4Aã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããããšã¯ãç¹ã«é£ãããããŸããã Androidãã©ãããã©ãŒã ã¯ããã®ãªãŒãã³æ§ãšã¢ã¯ã»ã¹æ§ã«åªããŠããŸãã ãã®ããã®ããã°ã©ãã³ã°ãå«ãã SL4Aã¯ãAndroidã¢ããªã±ãŒã·ã§ã³éçºã«æ°ããã¬ãã«ã®ã¢ã¯ã»ã·ããªãã£ããããããããŸããŸãªããã°ã©ãã³ã°èšèªã䜿çšã§ããããã«ããŸãã
SL4Aã®æ¬ ç¹
- SL4Aã¯ãŸã ã¢ã«ãã¡çã®æ®µéã«ãããŸãããä»ã§ã¯éåžžã«å€ãã®ãã°ããããŸã
- GUIãäœæããæ©èœã¯ãwebViewïŒhtmlããŒã¯ã¢ããïŒããã³æšæºã®ãã€ã¢ãã°ããã¯ã¹ã«ãã£ãŠå¶éãããŸãã kAISTã瀺åããŠããããã«ãr5ããŒãžã§ã³ïŒãŸã éå ¬åŒïŒããGUIã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå¥ã®å¯èœæ§ããããŸã-FullScreenUI
- SL4Aã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯ãJavaã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžãããŸã
- å¶éãããAPIæ©èœ
åç §è³æ
code.google.comã®Androidã¹ã¯ãªãããããžã§ã¯ã code.google.com
SL4AãšPython Proã®æ¬SL4Aã«ããAndroidã¹ã¯ãªããïŒPythonã䜿çšããAndroidãã€ãã£ãã¢ããªã®äœæ
SL4Açšã®Python
APIã®èª¬æ