А почему это кнопка энергосбережения ненужной вдруг стала?!
Выложите пожалуйста инструкцию, как на кнопку энергосбережения что-нибудь повесить?)
вот инструкция с china-phone, только проверку нажатия двух кнопок убрать и подставить коды нашей кнопки (по моему 539 540)
Но код определения кнопок переписал полностью. И убрал настройки из build.prop, мне не нужны. А кому нужны, легко добавить из исходной инструкции.
В результате:
Можно регулировать громкость плеера, фонарик на одну кнопку не включается.
Для включения зажать две кнопки громкости одновременно, для выключения — отпустить.
Если при зажатых кнопках включить экран, то фонарик не отключится при отпускании кнопок. Отключится только если выключить экран и нажать/отпустить обе кнопки громкости одновременно.
При включенном фонарике невозможно запустить камеру, т.к. она занята фонариком.
Если вам удастся при включенной камере запустить фонарик, то он не запустится, зато может зависнуть и перезапуститься ГУЙ. Я вроде сделал, что так не должно получатся, но мало ли, кто как нажмёт ))
Что где менять
android.policy.jar -> PhoneWindowManager.smali
Код:
Код: Выделить всё
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/android/internal/policy/impl/PhoneWindowManager$HideNavInputEventReceiver;,
Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;,
Lcom/android/internal/policy/impl/PhoneWindowManager$SettingsObserver;,
Lcom/android/internal/policy/impl/PhoneWindowManager$PolicyHandler;,
Lcom/android/internal/policy/impl/PhoneWindowManager$PointerLocationInputEventReceiver;
}
.end annotation
# static fields
.field static final APPLICATION_LAYER:I = 0x2
.field static final APPLICATION_MEDIA_OVERLAY_SUBLAYER:I = -0x1
Заменить на:
Код: Выделить всё
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/android/internal/policy/impl/PhoneWindowManager$HideNavInputEventReceiver;,
Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;,
Lcom/android/internal/policy/impl/PhoneWindowManager$SettingsObserver;,
Lcom/android/internal/policy/impl/PhoneWindowManager$PolicyHandler;,
Lcom/android/internal/policy/impl/PhoneWindowManager$PointerLocationInputEventReceiver;,
#sgh_b
Landroid/hardware/Camera$1;,
Landroid/hardware/Camera$Parameters;
#sgh_e
}
.end annotation
# static fields
.field public static camera:Landroid/hardware/Camera;
.field static final APPLICATION_LAYER:I = 0x2
.field static final APPLICATION_MEDIA_OVERLAY_SUBLAYER:I = -0x1
Здесь добавлены классы для работы с камерой и переменная для вызова функций камеры.
Код:
Код: Выделить всё
.field private mVolumeDownKeyTime:J
.field private mVolumeDownKeyTriggered:Z
.field private mVolumeUpKeyTriggered:Z
.field mWindowManager:Landroid/view/IWindowManager;
.field mWindowManagerFuncs:Landroid/view/WindowManagerPolicy$WindowManagerFuncs;
Заменить на:
Код: Выделить всё
.field private mVolumeDownKeyTime:J
.field private mVolumeDownKeyTriggered:Z
.field private mVolumeUpKeyTriggered:Z
#sgh_b
.field private mVUDKeyDown:Z
#sgh_e
.field mWindowManager:Landroid/view/IWindowManager;
.field mWindowManagerFuncs:Landroid/view/WindowManagerPolicy$WindowManagerFuncs;
Здесь добавлена переменная для определения состояния одновременного нажатия клавиш громкости.
После комментария:
Код: Выделить всё
# virtual methods
Вставить два метода для вкл/выкл фонарика:
Код: Выделить всё
.method public flash_on()V
.registers 4
.prologue
.line 27
invoke-static {}, Landroid/hardware/Camera;->open()Landroid/hardware/Camera;
move-result-object v1
sput-object v1, Lcom/android/internal/policy/impl/PhoneWindowManager;->camera:Landroid/hardware/Camera;
.line 28
sget-object v1, Lcom/android/internal/policy/impl/PhoneWindowManager;->camera:Landroid/hardware/Camera;
# check if camera is busy
if-eqz v1, :cond_cbusy
invoke-virtual {v1}, Landroid/hardware/Camera;->getParameters()Landroid/hardware/Camera$Parameters;
move-result-object v0
.line 29
.local v0, p:Landroid/hardware/Camera$Parameters;
const-string v1, "torch"
invoke-virtual {v0, v1}, Landroid/hardware/Camera$Parameters;->setFlashMode(Ljava/lang/String;)V
.line 30
sget-object v1, Lcom/android/internal/policy/impl/PhoneWindowManager;->camera:Landroid/hardware/Camera;
invoke-virtual {v1, v0}, Landroid/hardware/Camera;->setParameters(Landroid/hardware/Camera$Parameters;)V
:cond_cbusy
return-void
.end method
.method public flash_off()V
.registers 3
.prologue
.line 34
sget-object v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->camera:Landroid/hardware/Camera;
invoke-virtual {v0}, Landroid/hardware/Camera;->release()V
.line 35
return-void
.end method
В методе:
Код: Выделить всё
.method public interceptKeyBeforeQueueing(Landroid/view/KeyEvent;IZ)I
После строк:
Код: Выделить всё
const-string v14, " down ="
invoke-virtual {v13, v14}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v13
invoke-virtual {v13, v2}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
move-result-object v13
const-string v14, " canceled = "
invoke-virtual {v13, v14}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v13
invoke-virtual {v13, v1}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
move-result-object v13
invoke-virtual {v13}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v13
invoke-static {v12, v13}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
Добавить код:
Код: Выделить всё
#sgh_b
#check Display is off
if-nez v0, :cond_n
#check key is down
if-eqz v2, :cond_kup
#check keycode
const/16 v14, 0x19
if-eq v7, v14, :cond_sk
const/16 v14, 0x18
if-eq v7, v14, :cond_sk
goto :cond_n
:cond_sk
#check second key was pressed earlier
iget-boolean v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVUDKeyDown:Z
if-nez v2, :cond_fon
:cond_skp
#set mVUDKeyDown Variable true
const/4 v2, 0x1
iput-boolean v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVUDKeyDown:Z
goto :cond_n
:cond_fon
#turn flash on
invoke-virtual {v15}, Lcom/android/internal/policy/impl/PhoneWindowManager;->flash_on()V
goto :cond_n
:cond_kup
# key is up
#check keycode
const/16 v14, 0x19
if-eq v7, v14, :cond_skup
const/16 v14, 0x18
if-eq v7, v14, :cond_skup
goto :cond_n
:cond_skup
#one of volume key is released, set mVUDKeyDown Variable false
const/4 v2, 0x0
iput-boolean v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVUDKeyDown:Z
# and turn flash off
invoke-virtual {v15}, Lcom/android/internal/policy/impl/PhoneWindowManager;->flash_off()V
goto :cond_n
:cond_n
#sgh_e
Здесь происходит определение нажатости кнопок и вкл/выкл фонарика.