當前位置:首頁 » 安卓系統 » android的timertask

android的timertask

發布時間: 2025-08-30 02:12:13

❶ android 開發中如何實現視頻通話功能 !求大神指點!功能實現的思路,及用到的知識點!!感激不盡!!

/**
* Android視頻聊天
* 1、初始化SDK 2、連接伺服器、 3、用戶登錄;4、進入房間;5、打開本地視頻;6、請求對方視頻
*/
public class VideoChatActivity extends Activity implements AnyChatBaseEvent
{
private AnyChatCoreSDK anychat; // 核心SDK
private SurfaceView remoteSurfaceView; // 對方視頻
private SurfaceView localSurfaceView; // 本地視頻
private ConfigEntity configEntity;
private boolean bSelfVideoOpened = false; // 本地視頻是否已打開
private boolean bOtherVideoOpened = false; // 對方視頻是否已打開
private TimerTask mTimerTask; // 定時器
private Timer mTimer = new Timer(true);
private Handler handler; // 用Handler來不間斷刷新即時視頻
private List<String> userlist = new ArrayList<String>();//保存在線用戶列表
private int userid; // 用戶ID
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_chat);
remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);
localSurfaceView = (SurfaceView) findViewById(R.id.surface_local);
configEntity = ConfigService.LoadConfig(this);//載入視頻通話設置
loginSystem();// 初始化SDK 連接伺服器
mTimerTask = new TimerTask(){
public void run(){
Message mesasge = new Message();
handler.sendMessage(mesasge);
}
};
mTimer.schele(mTimerTask, 1000, 100);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
VideoChat();// 不間斷顯示即時視頻通話畫面
super.handleMessage(msg);
}
};
}
// 初始化SDK 連接伺服器
private void loginSystem(){
if (anychat == null){
anychat = new AnyChatCoreSDK();
anychat.SetBaseEvent(this); // 設置基本事件回調函數
if (configEntity.useARMv6Lib != 0) // 使用ARMv6指令集
anychat.SetSDKOptionInt(AnyChatDefine.
BRAC_SO_CORESDK_USEARMV6LIB, 1);
anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK
}
anychat.Connect("demo.anychat.cn", 8906);// 連接伺服器
}
// 顯示即時視頻通話畫面
public void VideoChat(){
if (!bOtherVideoOpened){
if (anychat.GetCameraState(userid) == 2
&& anychat.GetUserVideoWidth(userid) != 0){
SurfaceHolder holder = remoteSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(userid),
anychat.GetUserVideoHeight(userid));
Surface s = holder.getSurface(); // 獲得視頻畫面
anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 調用API顯示視頻畫面
bOtherVideoOpened = true;
}
if (!bSelfVideoOpened){
if (anychat.GetCameraState(-1) == 2
&& anychat.GetUserVideoWidth(-1) != 0){
SurfaceHolder holder = localSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(-1),
anychat.GetUserVideoHeight(-1));
Surface s = holder.getSurface();
anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
bSelfVideoOpened = true;
}
}
}
public void OnAnyChatConnectMessage(boolean bSuccess){
if (!bSuccess){
Toast.makeText(VideoChatActivity.this, "連接伺服器失敗,自動重連,請稍後...", Toast.LENGTH_SHORT).show();
}
anychat.Login("android", ""); // 伺服器連接成功 用戶登錄
}
public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){
if (dwErrorCode == 0) {
Toast.makeText(this, "登錄成功!", Toast.LENGTH_SHORT).show();
anychat.EnterRoom(1, ""); // 用戶登錄成功 進入房間
ApplyVideoConfig();
} else {
Toast.makeText(this, "登錄失敗,錯誤代碼:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
if (dwErrorCode == 0) { // 進入房間成功 打開本地音視頻
Toast.makeText(this, "進入房間成功", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(-1, 1); // 打開本地視頻
anychat.UserSpeakControl(-1, 1); // 打開本地音頻
} else {
Toast.makeText(this, "進入房間失敗,錯誤代碼:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){
if (dwRoomId == 1){
int user[] = anychat.GetOnlineUser();
if (user.length != 0){
for (int i = 0; i < user.length; i++){
userlist.add(user[i]+"");
. }
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 請求用戶視頻
anychat.UserSpeakControl(userid, 1); // 請求用戶音頻
}
else {
Toast.makeText(VideoChatActivity.this, "當前沒有在線用戶", Toast.LENGTH_SHORT).show();
}
}
}
public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){
if (bEnter) {//新用戶進入房間
userlist.add(dwUserId+"");
}
else { //用戶離開房間
if (dwUserId == userid)
{
Toast.makeText(VideoChatActivity.this, "視頻用戶已下線", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(userid, 0);// 關閉用戶視頻
anychat.UserSpeakControl(userid, 0); // 關閉用戶音頻
userlist.remove(userid+""); //移除該用戶
if (userlist.size() != 0)
{
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 請求其他用戶視頻
anychat.UserSpeakControl(userid, 1); // 請求其他用戶音頻
}
}
141. else {
userlist.remove(dwUserId+""); //移除該用戶
}
}
}
public void OnAnyChatLinkCloseMessage(int dwErrorCode){
Toast.makeText(VideoChatActivity.this, "連接關閉,error:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy(){ //程序退出
anychat.LeaveRoom(-1); //離開房間
anychat.Logout(); //注銷登錄
anychat.Release(); //釋放資源
mTimer.cancel();
super.onDestroy();
}
// 根據配置文件配置視頻參數
private void ApplyVideoConfig(){
if (configEntity.configMode == 1) // 自定義視頻參數配置
{
// 設置本地視頻編碼的碼率(如果碼率為0,則表示使用質量優先模式)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL,configEntity.videoBitrate);
if (configEntity.videoBitrate == 0)
{
// 設置本地視頻編碼的質量
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL,configEntity.videoQuality);
}
// 設置本地視頻編碼的幀率
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL,configEntity.videoFps);
// 設置本地視頻編碼的關鍵幀間隔
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL,configEntity.videoFps * 4);
// 設置本地視頻採集解析度
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL,configEntity.resolution_width);
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL,configEntity.resolution_height);
// 設置視頻編碼預設參數(值越大,編碼質量越高,佔用CPU資源也會越高)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL,configEntity.videoPreset);
}
// 讓視頻參數生效
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM,configEntity.configMode);
// P2P設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC,configEntity.enableP2P);
// 本地視頻Overlay模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY,configEntity.videoOverlay);
// 迴音消除設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL,configEntity.enableAEC);
// 平台硬體編碼設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC,configEntity.useHWCodec);
// 視頻旋轉模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL,configEntity.videorotatemode);
// 視頻平滑播放模式設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE,configEntity.smoothPlayMode);
// 視頻採集驅動設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER,configEntity.videoCapDriver);
// 本地視頻採集偏色修正設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA,configEntity.fixcolordeviation);
// 視頻顯示驅動設置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL,configEntity.videoShowDriver);
}
}

❷ 如何定時刷新Android界面

Android程序中可以使用的界面刷新方法有兩種,分別是利用Handler和利用postInvalidate()來實現在線程中刷新界面。
利用Handler刷新界面
實例化一個Handler對象,並重寫handleMessage方法調用invalidate()實現界面刷新;而在線程中通過sendMessage發送界面更新消息。
復制到剪貼板 java代碼// 在onCreate()中開啟線程 new Thread(new GameThread()).start();、 // 實例化一個handler Handler myHandler = new Handler() { //接收到消息後處理 public void handleMessage(Message msg) { switch (msg.what) { case Activity01.REFRESH: mGameView.invalidate(); //刷新界面 break; } super.handleMessage(msg); } }; class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = Activity01.REFRESH; //發送消息 Activity01.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } 使用postInvalidate()刷新界面
使用postInvalidate則比較簡單,不需要handler,直接在線程中調用postInvalidate即可。
復制到剪貼板 Java代碼class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } //使用postInvalidate可以直接在線程中更新界 mGameView.postInvalidate(); } } }

❸ android裡面怎樣強制彈出鍵盤啊

Android軟鍵盤強制彈出及隱藏輸入法的方法:

  • 很多應用中對於一個界面比如進入搜索界面或者修改信息等等情況,為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出(因為用戶進入該界面必然是為了更改信息)。具體實現這種效果的代碼如下:

java代碼

EditTexteditText.setFocusable(true);

editText.setFocusableInTouchMode(true);

editText.requestFocus();

InputMethodManager inputManager =

(InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

inputManager.showSoftInput(editText,0);

  • 首先要對指定的輸入框請求焦點。然後調用輸入管理器彈出軟鍵盤。

    • 警告:對於剛跳到一個新的界面就要彈出軟鍵盤的情況上述代碼可能由於界面為載入完全而無法彈出軟鍵盤。此時應該適當的延遲彈出軟鍵盤如998毫秒(保證界面的數據載入完成)。實例代碼如下:

    java代碼:

    Timer timer =newTimer();

    timer.schele(newTimerTask()

    {

    publicvoidrun()

    {

    InputMethodManager inputManager =

    (InputMethodManager)editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

    inputManager.showSoftInput(editText,0);

    }

    },

    998);


❹ android實現自動點擊按鈕

Timertimer=newTimer();
Handlerhandler=newHandler(){

publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case1:
path_button.performClick();
break;
}
super.handleMessage(msg);
}

};
TimerTasktask=newTimerTask(){

publicvoidrun(){
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}

};
timer.schele(task,0,1*1000);

❺ Timer、TimerTask的簡單應用及如何解決多次調度相同任務。

1、Timer類用來幹嘛滴?Timer是提供以指定的時間間隔執行某方法的這樣一種機制,即如果想要實現一個定時發送數據,比如每隔3s中發送一次心跳報文,或者執行某個指定的方法,都可以考慮用Timer類來實現,不過要提出的是Timer類一邊用來做一些比較簡單又不耗時間的操作。據說是因為它執行的任務仍然在主線程裡面(不確定,望牛人指出)。2、Timer類最常用的方法:cancel() //取消當然任務schele(TimerTask task, long delay) //延時一段時間執行task任務schele(TimerTask task, long delay, long period)//延時delay時間後,執行task任務,以後每隔peroid時間執行一次task任務。3、如何用?在Java中如何使用,代碼如下:public class TimerTest{public static void main(String[] args){timerTest();}private static void timerTest(){final Timer timer = new Timer();TimerTask task = new TimerTask(){int i = 0;public void run(){System.out.println("次數====" + i++);if(i == 10){i = 0 ;timer.cancel();// timerTest();}}};timer.schele(task, 1000, 1000);}}註: 注釋掉藍色字眼的timerTest();是用來解決多次調度執行相同任務實現滴。就如實現從0到10輸出後,又要從0開始輸出,這兩次調度。就要用重新調用此方法來實現。Android裡面,代碼如下:public class TimerTestAndroidActivity extends Activity{Handler handler;TextView textView;Timer timer ;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);textView = (TextView) findViewById(R.id.textView1);playTimer();handler = new Handler(){int i = 0;public void handleMessage(Message msg){i = msg.what;textView.setText("The current number is " + i);if (i == 5){timer.cancel();playTimer();}}};}private void playTimer(){timer= new Timer();timer.schele(new TimerTask(){ int i;public void run(){Message msg = new Message();msg.what = i++;handler.sendMessage(msg);}}, 1000, 1000); }}

熱點內容
linux卷管理 發布:2025-08-30 03:58:05 瀏覽:209
如何查到自己的wifi密碼 發布:2025-08-30 03:49:05 瀏覽:661
linux默認編碼 發布:2025-08-30 03:44:23 瀏覽:287
如何取消安卓手機日誌抓取文件 發布:2025-08-30 03:20:12 瀏覽:535
安卓渠道服什麼樣子 發布:2025-08-30 03:19:21 瀏覽:918
愛奇藝安卓和蘋果哪個好 發布:2025-08-30 02:57:16 瀏覽:454
國內安卓機哪個牌子拍照美顏最好 發布:2025-08-30 02:52:13 瀏覽:344
數據存儲時間 發布:2025-08-30 02:51:36 瀏覽:604
php生成不重復的數字 發布:2025-08-30 02:46:25 瀏覽:376
把txt文件導入資料庫 發布:2025-08-30 02:33:30 瀏覽:278