0

C の NDK ネイティブ コードでデバイスの時刻を設定しようとしています。

struct timeval tv = {timet, 0};
struct timezone tz = {timezone, daylight}; // The second timezone is long int. Time lib extern which perfectly suits here.
if (settimeofday(&tv, &tz) != 0)
{
    LOG(("settimeofday() failed: %s", strerror(errno)));
}

結果は

settimeofday() failed: Read-only file system

ネイティブで時間を設定する他の方法はありますか? それはまったく可能ですか?問題の読み取り専用ファイル システムの部分を確認しましたが、ルート化されたデバイスはありません。

前もって感謝します!

4

2 に答える 2

1

十分な権限がないとデバイスの時刻を設定できず、ルート化されていないデバイスではアプリがその権限を取得できません。マニュアルページから:

   EPERM  The calling process has insufficient privilege to call  settime-
          ofday(); under Linux the CAP_SYS_TIME capability is required.

設定できたとしても、次にデバイスがネットワーク経由で時刻の更新を取得したときに上書きされる可能性があります。

EPERM の代わりに EROFS を取得しているのは少し奇妙です。

于 2013-09-18T15:02:34.110 に答える
1

Android システム クロックは、非システム アプリの読み取り権限のみを持つ「/dev/alarm」にマッピングされます。したがって、ストックデバイスの時間を変更しようとしている場合は、運が悪い. どちらかを使用する必要があります-

  1. 設定アプリ (システム特権で実行されるシステム アプリ) または
  2. システム特権でアプリに署名します (ベンダーで働いているか、独自の FW を展開している場合を除き、これは不可能です)

そのため、アプリのみを使用してシステム時刻を変更する場合は、「/dev/alarm」の権限を書き込み可能に変更する必要があります (adb シェルから chmod 666 /dev/alarm を実行します)。そのためには、ルート化されたデバイスが必要です。

アクセス許可を変更すると、アプリ (SystemClock.setCurrentTimeMillis()) から Java API を使用して時間を変更できるようになります。

settimeofday() または clock_settime() で動作させることはまだできません。

お役に立てれば。

于 2013-09-19T06:15:42.387 に答える