電話線程類CalllReceiver
只要有電話,不管是電話打出去,還是電話打進來會執行到藍色代碼。
TelephonyManager.CALL_STATE_RINGING: 電話打進來狀態
TelephonyManager.CALL_STATE_OFFHOOK:電話打進來接通狀態;電話打出時首先監聽到的狀態,不會有TelephonyManager.CALL_STATE_RINGING狀態
TelephonyManager.CALL_STATE_IDLE:不管是電話打出去還是電話打進來都會監聽到的狀態。
接電話會監聽三個狀態,打電話只會監聽到下面2個。注意
主線程的暫停,wait();通過boolean值判斷執行。線程的喚醒notify();
/**
* 電話監聽類
*
* @author yuan
*
*/
public class CallReceiver extends BroadcastReceiver {
private String TAG = "CallReceiver";
// 有電話進來標誌falg
static boolean incomingFlag = false;
// 有電話出去標誌falg
static boolean outFlag = false;
// 線程暫停標誌falg
public static boolean waitFlag = false;
// 圖片不清空標誌
public static boolean Pause = false;
String incoming_number = null;
@Override
public void onReceive(Context context, Intent intent) {
Util.printLog(TAG, "監聽電話");
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
waitFlag = true;
if (BaseControl.mSoundPlayerManager != null) {
BaseControl.mSoundPlayerManager.setOpenSound(false);
}
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;
incoming_number = intent.getStringExtra("incoming_number");
Util.printLog(TAG, "RINGING:" + incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
outFlag = true;
if (incomingFlag) {
Util.printLog(TAG, "接電話中:" + incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (incomingFlag || outFlag) {
waitFlag = false;
incomingFlag = false;
outFlag = false;
if (BaseControl.mSoundPlayerManager != null) {
BaseControl.mSoundPlayerManager
.setOpenSound(BaseControl.isPlaySound);
}
try {
synchronized (BaseControl.mGameSurfaceView.myTimerThread) {
BaseControl.mGameSurfaceView.myTimerThread.notify(); //啟動線程
}
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
}
}
public class TimerThread extends Thread {
/**
* 線程啟動
*/
@Override
public void run() {
super.run();
while (timerFlag) {
if (CallReceiver.waitFlag) {
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
long nowTime = System.currentTimeMillis();
if(chuzzleState == ChuzzleConst.GS_START){
//使用上次暫停時間計算進度
if(isUsePauseTime){
nowTime = pauseGameTime;
isUsePauseTime = false;
}
if(!BaseControl.isOnLineMode){
// 1.判斷是否過了一秒,更新進度條
if ((nowTime - startGameTime) > ChuzzleConst.DECRESS_SCORE_CURRENT_TIME) {
// 2.判斷是否畫結算
if (currentScore < -50 || currentScore > 50) {
timerFlag = false;
chuzzleState = ChuzzleConst.GS_END_WAITTING;
updateProgress();
Message msg = BaseControl.mHandler.obtainMessage(ChuzzleConst.MSG_GAME_MSG_UPDATE_RECORDE, 0, 0, null);
BaseControl.mHandler.sendMessage(msg);
drawBalance();
return;
}
// 進度自動減1%
currentScore--;
// 更新進度條
updateProgress();
startGameTime = nowTime;
}
}
// 2.判斷是否過了10s,提示移動位置
if ((nowTime - startStepTime) > ChuzzleConst.HELP_OVERtIME
&& !isTouchedDown && !isBusy) {
// 畫提示位置
drawPointOut();
// 擷取當前顯示的時間,取消提示繪畫
startStepTime = System.currentTimeMillis();
}
}
}
}
}
在AndroidManifest.xml添加許可權
<!-- yuan -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--添加可監聽電話狀態的許可權-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--添加可打出電話的許可權-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<!--添加可打電話的許可權-->
<uses-permission id="android.permission.CALL_PHONE" />
<!--添加可接受簡訊的許可權-->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 訪問inter網許可權開通 -->
<uses-permission android:name="android.permission.INTERNET" />
<!--添加可擷取手機資訊的許可權-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--添加可傳送簡訊的許可權-->
<uses-permission android:name="android.permission.SEND_SMS" />
<!--添加修改APN網路許可權-->
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
<!--添加擷取無線網路許可權-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--添加進入網路許可權-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--添加修改使用網路許可權-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!--關閉程式許可權-->
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<!-- sd寫檔案許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<receiver android:name="CallReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>