android遊戲來電處理

來源:互聯網
上載者:User

電話線程類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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.