1. 程式人生 > >Android鎖屏狀態獲取音量按鍵事件

Android鎖屏狀態獲取音量按鍵事件

Android系統沒有提供音量按鍵的廣播,而Activity的onKeyDown方法只有在介面顯示時才能捕獲音量變化,
要在鎖屏狀態或後臺獲得音量按鍵事件,可以通過判斷音量值的改變來判斷是否按下了音量鍵。實現的具體思路是:
開一個子執行緒,持續判斷當前音量值和之前音量值是否一致,如果不同說明按下了音量鍵,並且重置音量值,使音量不在最大值或最小值上。
package com.hy2014.phonesafer.activity;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;

/**
 * 
 * @author Dawin Create 2015-01-19
 */
public class VolumeChangeActivity extends Activity
{

	/**
	 * 當前音量
	 */
	private int currentVolume;
	/**
	 * 控制音量的物件
	 */
	public AudioManager mAudioManager;
	/**
	 * 系統最大音量
	 */
	private int maxVolume;
	/**
	 * 確保關閉程式後,停止執行緒
	 */
	private boolean isDestroy;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		isDestroy = false;
		// 獲得AudioManager物件
		mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);//音樂音量,如果要監聽鈴聲音量變化,則改為AudioManager.STREAM_RING
		maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
	}

	@Override
	protected void onDestroy()
	{
		super.onDestroy();
		isDestroy = true;
	}

	/**
	 * 監聽音量按鍵的執行緒
	 */
	private Thread volumeChangeThread;

	/**
	 * 持續監聽音量變化 說明: 當前音量改變時,將音量值重置為最大值減2
	 */
	public void onVolumeChangeListener()
	{

		currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
		volumeChangeThread = new Thread()
		{
			public void run()
			{
				while (!isDestroy)
					{
						int count = 0;
						boolean isDerease = false;
						// 監聽的時間間隔
						try
							{
								Thread.sleep(20);
							} catch (InterruptedException e)
							{
								System.out.println("error in onVolumeChangeListener Thread.sleep(20) " + e.getMessage());
							}

						if (currentVolume < mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
							{
								count++;
								currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
								// 設定音量等於 maxVolume-2的原因是:當音量值是最大值和最小值時,按音量加或減沒有改變,所以每次都設定為固定的值。
								mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume - 2,
										AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
							}
						if (currentVolume > mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC))
							{
								count++;
								currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
								mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume - 2,
										AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
								if (count == 1)
									{
										isDerease = true;
									}

							}

						if (count == 2)
							{
								System.out.println("按下了音量+");

							} else if (isDerease)
							{
								System.out.println("按下了音量-");
							}

					}
			};
		};
		volumeChangeThread.start();
	}

}

相關推薦

Android狀態獲取音量按鍵事件

Android系統沒有提供音量按鍵的廣播,而Activity的onKeyDown方法只有在介面顯示時才能捕獲音量變化, 要在鎖屏狀態或後臺獲得音量按鍵事件,可以通過判斷音量值的改變來判斷是否按下了音量鍵。實現的具體思路是: 開一個子執行緒,持續判斷當前音量值和之前音量值是

android 狀態下顯示activity

在activity onCreate下新增  int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; getWindow().addFlags(flags); WindowManager.LayoutPar

android狀態下, 新訊息喚醒螢幕,並跳轉到指定頁面

最近在做一個專案,有個功能,就和QQ電話差不多,我這邊手機鎖屏狀態,當QQ電話過來時,立刻喚醒螢幕,並顯示QQ來電介面,我的是當裝置端有事件發生時通知app端彈出介面,實時顯示裝置端資訊。 最核心的程

Android狀態下點亮螢幕並彈窗提醒

類似於手機鎖屏狀態下QQ來訊息然後點亮螢幕並彈窗,如圖。 相信QQ的這個功能大家都是很熟悉的了,下面就開始講具體的實現步驟。 一、新建一個Activity並在OnCreate中新增四個標識 @Override protected

android O如何獲取當前狀態

以下程式碼在Android O驗證可行。 主要作用:獲取當前是否處於鎖屏狀態。 主要是呼叫KeyguardManager裡面的介面,同樣可以使用其他介面判斷當前是否是安全鎖屏等。 import android.app.KeyguardManager; KeyguardMan

Android或滅狀態下,快速按兩次音量下鍵實現抓拍功能(1.1Framework層使用廣播形式實現)

實現思路:     WindowManagerService迴圈讀取下面按鍵訊息並分發給視窗,在訊息分發前會在PhoneWindowManager.interceptKeyBeforeQueueing方法中進行訊息的過濾。因此該實現方式為在訊息分發前的interceptKe

Android或滅狀態下,快速按兩次音量下鍵實現抓拍功能(一,Framework層實現)

    WindowManagerService迴圈讀取下面按鍵訊息並分發給視窗,在訊息分發前會在PhoneWindowManager.interceptKeyBeforeQueueing方法中進行訊息的過濾。因此該實現方式為在訊息分發前的interceptKeyBeforeQueueing方法中監聽當前按

Windows利用WTS API獲取狀態

下面的這個函式可以獲取Windows是否處於鎖屏狀態: 程式碼來自stackoverflow,C++: check if computer is locked。 #include <Windows.h> #include <WtsApi32.h> boo

android 滑動狀態下如何禁止下拉狀態

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android------(手機啟動出現界面)

自定義 urn 一起 alt 點擊下載 tac ces roi class 以前用過一個紅包鎖屏的軟件,第一次打開手機出現鎖屏,滑動領取收益,當時覺得這功能不錯,就查閱資料,寫了一個案例, apk運行流程: 進入軟件---》啟動服務---》關閉手機(可先退出應用)--》

Android勒索病毒分析(4)秒搶紅包

1.樣本概況 1.1 基本資訊 樣本名稱: 秒搶紅包 所屬家族: 鎖屏勒索病毒 MD5值: 033ae1ba78676130e99acc8d9f853124 包名: com.h 入口: MainActivity 最低執行環境: Android2.2

Android勒索病毒分析(3)刷贊

1.樣本概況 1.1 基本資訊 樣本名稱: 刷贊. 所屬家族: 鎖屏勒索病毒(a.rogue.SimpleLocker.a) MD5值: 7626090b69cd1e2e5671a022712808eb 包名: com.binge.mohe 入口: Mai

Android勒索病毒分析(2)免流伺服器

1.樣本概況 1.1 基本資訊 樣本名稱: 免流伺服器. 所屬家族: 鎖屏勒索病毒(a.rogue.SimpleLocker.a) MD5值: 2efca46f34a565c2ef4052b89b6b364b 包名: zs.ip.proxy 入口: Mai

Android勒索病毒分析(1)BWM線上

1.樣本概況 1.1 基本資訊 樣本名稱: 刷贊. 所屬家族: 鎖屏勒索病毒(a.rogue.SimpleLocker.a) MD5值: 7626090b69cd1e2e5671a022712808eb 包名: com.binge.mohe 入口: MainActiv

仿QQ狀態下訊息提醒

最近專案開發中需要手機螢幕喚醒功能,查閱資料後整理了demo,當鎖屏狀態下收到通知,喚醒螢幕。主要思路為通過MyService服務傳送一條廣播,然後判斷如果為鎖屏狀態就啟動鎖屏訊息的activity.此時有震動和鈴聲提示,顯示倒計時。 下面請看效果圖: 實現步驟: 1:在

【架構分析】Android與Activity生命週期的變化

概述 Android開機啟動後預設會先進入鎖屏然後滅屏休眠, 本文旨在介紹這個過程中最先啟動的Home Launch Activity (其實在Android N上最早被啟動的是Settings中的FallbackHome Activity) 如何發生相關的生命週期變化, 以及AMS

Android出現java.lang.RuntimeException: Camera is being used after Camera.release() was called

        java.lang.RuntimeException: Camera is being used after Camera.release() was called         在相機開發中,開啟相機顯示預覽,然後按關機鍵鎖屏,出現上述錯誤,程式崩潰。

去除android

將frameworks/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java  程式碼中的 mExternallyEnabled 由ture變為false即可 private b

android 重新開啟後fragment無法切換解決方案

做的是平板程式,用的橫版,開啟後就是4個fragment,後來發現鎖屏重新開啟後fragment無法切換了 後來去網上找了下用了別人的方法解決了,內容如下: 今天在寫一個應用的時候,因為需要設定成橫屏模式,所以在Manifest裡面的Activity裡面加了兩個引數設

Android 藍芽狀態獲取

1. 藍芽狀態是否連線: public static boolean isBTConnected(){ BluetoothAdapter blueadapter = BluetoothAdapter.getDefaultAdapter(); //adapter也有getState