15

android-scriptingを使用して記述された Python スクリプトを次に示します。

import android, time

droid = android.Android()
interval = 1 # every 1 minute

while True:
    # define your own vibrate pattern here
    droid.vibrate(200)
    time.sleep(0.3)
    droid.vibrate(300)

    time.sleep(60*interval)

基本的に毎分振動します (モチベーターのように)。ただし、画面が空白の状態で電話をロックすると、振動は感じられません。おそらく、Android はスクリプトをフリーズしています (そのため、while ループもフリーズしています)。実際にこのスクリプトをサービスとして実行していることに注意してください (ロングタップして [サービスとして開始] をクリックします)。

電話のサスペンド状態に関係なく、このスクリプトを常に機能させる方法はありますか?

更新 1 : 毎分ではなく、5 ~ 10 分ごとにランダムに振動が聞こえることがあります。

更新 2 : この問題は、スクリプトを通常 (サービスとしてではなく) 実行すると発生します。「time.sleep」は指定された時間スリープしていないようです。

4

5 に答える 5

10

スクリプト環境は間違いなく二流市民です。必要なものは、ELAPSED_REALTIME を使用して AlarmManager と呼ばれます。スクリプト環境でそれが利用できない場合は、行き詰まります。

スクリプト環境は、少なくとも現在のところ、完全なアプリケーションを作成できる開発キット環境を完全に置き換えることを意図したものではありません。より複雑なことを行うことができないという犠牲を払って、いくつかの簡単なスクリプト タスクを実行できるようにすることを目的としています。ごめん。

于 2010-02-05T15:41:56.450 に答える
2

私は同じ種類の問題に直面しています。

Android デバイスが「ロック」モードの場合、time.sleep() は信頼できません。

サムスンギャラクシーSのSL4Aリリース4 + pythonForAndroid_r5 +アンドロイド2.3.3で試したことがいくつかあります

  • droid.wakeLockAcquirePartial() と droid.wakeLockRelease() 内に time.sleep(interval) ループをラップします。これにより、CPU の速度が低下するのを防ぐことができます。
  • eventWaitFor(eventName, timeOutInMilliSeconds) 呼び出しを使用します。

droid.eventWaitFor("ThisEventCannotHappen", interval*60000)

  • threading.Timer() オブジェクトも、デバイスでいくつかのテストを行った後、期待どおりに動作しているようです (確認が必要です...)

確かではありませんが、これらのトリックは真の「ロック/スリープ」モードで予想以上に多くの電力を消費し、デバイスの実行時間を短縮する可能性があることに注意してください.

更新: eventWaitFor() は、長い間隔でも信頼できません。以下は、Timer() がどのように機能するかを示すスニペットです。

import android
import threading
import logging


def doStuff():
    logging.info("testTimer.py: Stuff DONE")
    droid.notify('testTimer.py',"doStuff() has been called")
    droid.vibrate(500)

def createLog(path):
    logging.basicConfig(filename=path,
                        level=logging.INFO,
                        format='%(asctime)s %(message)s')

DELAY=600

droid=android.Android()
logpath="/mnt/sdcard/testTimer.py.log"
createLog(logpath)
timer=threading.Timer(DELAY,doStuff)
logging.info("timer starting now")
timer.start()
logging.info("doStuff() will be called by timer...Delay=%d" % DELAY)
于 2011-11-13T00:33:56.707 に答える
-1

Pythonバインディングについてはよくわからないので、一般的なAndroidの問題として回答します。電源管理を参照してください。

PARTIAL_WAKE_LOCK「CPU が動作していることを保証するウェイク ロック。画面がオンになっていない可能性があります。」

Wake Lock の例を調べる

すべての電源管理呼び出しは、同じ基本形式に従います。

  1. PowerManager サービスへのハンドルを取得します。
  2. ウェイク ロックを作成し、画面、タイムアウトなどの電源管理フラグを指定します。
  3. ウェイクロックを取得します。
  4. 操作を実行します (MP3 を再生する、HTML ページを開くなど)。
  5. ウェイクロックを解除します。以下のスニペットは、このプロセスを示しています。
PowerManager pm = (PowerManager)mContext.getSystemService(
                                          Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
wl.acquire();
 // ...
wl.release();
于 2010-01-25T23:44:03.347 に答える
-2

考えられる解決策:いくつかのスケジューラソフトウェアを使用して、スクリプトを定期的に開始します。このようにして、time.sleep()を呼び出す必要はありません。

たぶん、スクリプトはそのような定期的なタスクに最適なソリューションではありません。単純なJavaアプリを作成すれば、この問題に直面することはありません。

于 2010-01-24T03:57:51.203 に答える