/* * Copyright (C) 2012 YIXIA.COM * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.ccsu.ShareFV; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import cn.ccsu.ShareFV.IJetty; import cn.ccsu.ShareFV.IJettyService; import cn.ccsu.chatserver.ServerThread; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.MediaPlayer.OnCompletionListener; import io.vov.vitamio.MediaPlayer.OnInfoListener; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.MediaController.OnHiddenListener; import io.vov.vitamio.widget.MediaController.OnShownListener; import io.vov.vitamio.widget.VideoView; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Display; import android.view.GestureDetector; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.PopupWindow.OnDismissListener; public class PlayVideo extends Activity implements OnCompletionListener, OnInfoListener, Runnable { private String path = "";//����·�� // private String path = "/sdcard/MIDH-vision-V3.mp4"; // private String path = "http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8 "; private VideoView mVideoView;//VideoView private MediaController mMediaController;//���ſ����� private View mVolumeBrightnessLayout; private ImageView mOperationBg; private ImageView mOperationPercent; private AudioManager mAudioManager; private int mMaxVolume;//������� private int mVolume = -1;//��ǰ���� private float mBrightness = -1f;//��ǰ���� private int mLayout = VideoView.VIDEO_LAYOUT_ZOOM;//��ǰ����ģʽ private GestureDetector mGestureDetector; private View mLoadingView; //������ӿؼ���������ʾ��ʱ����ʾ�������ٶ���ʾ�� private RelativeLayout videoview_RelativeLayout_1;//������������ͼ private TextView TextView_time,TextView_battery,TextView_download; private ImageButton ImageButton_back; private boolean isExit;//�Ƿ��˳� private String download_string; private TextView file_Name;//��ʾ�ļ��� private long Position;//��ǰ����λ�� //���첿�� private ImageButton pop_btn; private PopupWindow pop; private EditText historyEdit; private EditText messageEdit; private Button sendButton; /** * �����ַ�����name�洢�û��� chat_txt�洢������Ϣ chat_in�洢�ӷ��������յ�����Ϣ ****/ private String username, ip, chat_txt, chat_in; // �����׽��ֶ��� Socket socket; // �����̶߳��� Thread thread; // �����ͻ������������������ DataInputStream dataInputStream; DataOutputStream dataOutputStream; // �Ƿ��¼�ı�� boolean flag = false; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); //���Vitamio�Ƿ��ѹ����� if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this)){ //Vitamio�����δ������ѹ Toast.makeText(this, "�������ѹʧ�ܣ�", Toast.LENGTH_SHORT).show(); return; } Bundle extras = getIntent().getExtras();//����button��������ֵ ip=extras.getString("hostip"); if(IJettyService.isRunning()) { path="/mnt/sdcard/jetty/webapps/jetty/gongxiang.flv"; } else { path="http://"+ip+":"+IJetty.__PORT_DEFAULT+"/jetty/gongxiang.flv"; } Log.d("path=",path); //�󶨲�����ͼ setContentView(R.layout.videoview); LayoutInflater inflater = LayoutInflater.from(this); // ���봰�������ļ� View view = inflater.inflate(R.layout.popupwindow, null); // ����PopupWindow���� pop = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false); pop_btn = (ImageButton) findViewById(R.id.popupwindow); // ��Ҫ����һ�´˲����������߿���ʧ pop.setBackgroundDrawable(new BitmapDrawable()); //���õ��������ߴ�����ʧ pop.setOutsideTouchable(true); // ���ô˲�����ý��㣬�����޷���� pop.setFocusable(true); pop.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { pop_btn.setVisibility(View.VISIBLE); } }); pop_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { if(pop.isShowing()) { // ���ش��ڣ���������˵��������Сʱ������Ҫ�˷�ʽ���� pop.dismiss(); } else { // ��ʾ���� if(flag==false){ //��û�е�¼ final EditText editText = new EditText(PlayVideo.this);//���ڻ�ȡ�û�������û��� new AlertDialog.Builder(PlayVideo.this).setTitle("�����dzƼ���������").setIcon( android.R.drawable.ic_dialog_info).setView( editText).setPositiveButton("ȷ��", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // "����������"��ť�Ĵ��� if (flag == true) { Toast.makeText(PlayVideo.this, "�ף����Ѿ���½����������", Toast.LENGTH_LONG).show(); return; } // ��ȡ�û��� username = editText.getText().toString(); // �ж��û����Ƿ���Ч��ip�Ƿ�Ϊ�� if (username != "" && username != null && username != "�û�������" && ip != null) { SocketThread socketThread=new SocketThread(); Thread sThread=new Thread(socketThread); sThread.start(); thread = new Thread(PlayVideo.this); // �����̣߳��������������Ƿ�����Ϣ thread.start(); // ˵���Ѿ���¼�ɹ� flag = true; pop.showAtLocation(v,Gravity.CENTER,0,0); pop_btn.setVisibility(View.GONE); } } }) .setNegativeButton("ȡ��", null).show(); }else{ pop.showAtLocation(v,Gravity.CENTER,0,0); pop_btn.setVisibility(View.GONE); } } } }); // ʵ������� historyEdit = (EditText) view.findViewById(R.id.history); historyEdit.setKeyListener(null); messageEdit = (EditText) view.findViewById(R.id.message); sendButton = (Button)view.findViewById(R.id.SendButton); // Ϊ���Ͱ�ťע������� sendButton.setOnClickListener(listener); //�󶨿ؼ� mVideoView = (VideoView) findViewById(R.id.surface_view); mVolumeBrightnessLayout = findViewById(R.id.operation_volume_brightness); mOperationBg = (ImageView) findViewById(R.id.operation_bg); mOperationPercent = (ImageView) findViewById(R.id.operation_percent); mLoadingView = findViewById(R.id.video_loading); videoview_RelativeLayout_1 = (RelativeLayout) findViewById(R.id.videoview_RelativeLayout_1); //��������������Ϊ���ɼ� videoview_RelativeLayout_1.setVisibility(View.GONE); TextView_time = (TextView) findViewById(R.id.time); myThread timeThread = new myThread(); new Thread(timeThread).start();//�������̣߳�����ˢ��ʱ�� TextView_battery = (TextView) findViewById(R.id.battery); batteryLevel(); TextView_download = (TextView) findViewById(R.id.download); //���ذ���(mediacontroller_back)������¼����� ImageButton_back = (ImageButton) findViewById(R.id.mediacontroller_back); ImageButton_back.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isExit=true; exit(); } }); //�ļ�����ʾ�ؼ� file_Name = (TextView) findViewById(R.id.file_name); //file_Name.setText("����ӰƬ.rmvb"); //����ӰƬ·�� mVideoView.setVideoPath(path); //�󶨼����¼� mVideoView.setOnCompletionListener(this); mVideoView.setOnInfoListener(this); //����ӰƬ����Ϊ�� mVideoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //��ʼ�������� mMediaController = new MediaController(this); mMediaController.setOnShownListener(new OnShownListener() { public void onShown() { videoview_RelativeLayout_1.setVisibility(View.VISIBLE); pop_btn.setVisibility(View.VISIBLE); } }); mMediaController.setOnHiddenListener(new OnHiddenListener() { @Override public void onHidden() { videoview_RelativeLayout_1.setVisibility(View.GONE); pop_btn.setVisibility(View.GONE); } }); //�󶨿����� mVideoView.setMediaController(mMediaController); mVideoView.requestFocus(); mGestureDetector = new GestureDetector(this, new MyGestureListener()); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } @Override protected void onResume() { Log.d("VideoViewPlayer", "onResume"); super.onResume(); if (mVideoView != null) mVideoView.resume(); mVideoView.seekTo(Position); } @Override protected void onPause() { Log.d("VideoViewPlayer", "onPause"); super.onPause(); if (mVideoView != null) mVideoView.pause(); Position = mVideoView.getCurrentPosition(); } @Override protected void onDestroy() { Log.d("VideoViewPlayer", "onDestroy"); super.onDestroy(); if (mVideoView != null) mVideoView.stopPlayback(); } @Override protected void onRestart() { Log.d("VideoViewPlayer", "onRestart"); super.onRestart(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: exit(); return true; case KeyEvent.KEYCODE_MENU: mMediaController.show(MediaController.sDefaultTimeout); return true; case KeyEvent.KEYCODE_HOME: onPause(); return true; case KeyEvent.KEYCODE_VOLUME_UP: onVolumeSlide(0.05f); return true; case KeyEvent.KEYCODE_VOLUME_DOWN: onVolumeSlide(-0.05f); return true; default: return super.onKeyDown(keyCode, event); } } @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) return true; // �������ƽ��� switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: endGesture(); break; } return super.onTouchEvent(event); } /** ���ƽ��� */ private void endGesture() { mVolume = -1; mBrightness = -1f; // ���� mHandler.sendEmptyMessageDelayed(3, 1000); } private class MyGestureListener extends SimpleOnGestureListener { /** ˫�� */ @Override public boolean onDoubleTap(MotionEvent e) { if (mLayout == VideoView.VIDEO_LAYOUT_ZOOM) mLayout = VideoView.VIDEO_LAYOUT_ORIGIN; else mLayout++; if (mVideoView != null) mVideoView.setVideoLayout(mLayout, 0); return true; } /** ���� */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { float mOldX = e1.getX(), mOldY = e1.getY(); int y = (int) e2.getRawY(); Display disp = getWindowManager().getDefaultDisplay(); int windowWidth = disp.getWidth(); int windowHeight = disp.getHeight(); if (mOldX > windowWidth * 4.0 / 5){ // �ұ߻��� onVolumeSlide((mOldY - y) / windowHeight); Log.d("onVolumeSlide", Float.toString((mOldY - y) / windowHeight)); } else if (mOldX < windowWidth / 5.0)// ��߻��� onBrightnessSlide((mOldY - y) / windowHeight); return super.onScroll(e1, e2, distanceX, distanceY); } } /** * �����ı�������С * * @param percent */ private void onVolumeSlide(float percent) { if (mVolume == -1) { mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (mVolume < 0) mVolume = 0; // ��ʾ mOperationBg.setImageResource(R.drawable.video_volumn_bg); mVolumeBrightnessLayout.setVisibility(View.VISIBLE); } int index = (int) (percent * mMaxVolume) + mVolume; if (index > mMaxVolume) index = mMaxVolume; else if (index < 0) index = 0; // ������� mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0); // ��������� ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams(); lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume; mOperationPercent.setLayoutParams(lp); } /** * �����ı����� * * @param percent */ private void onBrightnessSlide(float percent) { if (mBrightness < 0) { mBrightness = getWindow().getAttributes().screenBrightness; if (mBrightness <= 0.00f) mBrightness = 0.50f; if (mBrightness < 0.01f) mBrightness = 0.01f; // ��ʾ mOperationBg.setImageResource(R.drawable.video_brightness_bg); mVolumeBrightnessLayout.setVisibility(View.VISIBLE); } WindowManager.LayoutParams lpa = getWindow().getAttributes(); lpa.screenBrightness = mBrightness + percent; if (lpa.screenBrightness > 1.0f) lpa.screenBrightness = 1.0f; else if (lpa.screenBrightness < 0.01f) lpa.screenBrightness = 0.01f; getWindow().setAttributes(lpa); ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams(); lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness); mOperationPercent.setLayoutParams(lp); } @Override public void onConfigurationChanged(Configuration newConfig) { if (mVideoView != null) mVideoView.setVideoLayout(mLayout, 0); super.onConfigurationChanged(newConfig); } @Override public void onCompletion(MediaPlayer player) { finish(); } private void stopPlayer() { if (mVideoView != null) mVideoView.pause(); } private void startPlayer() { if (mVideoView != null) mVideoView.start(); } private boolean isPlaying() { return mVideoView != null && mVideoView.isPlaying(); } /** �Ƿ���Ҫ�Զ��ָ����ţ������Զ���ͣ���ָ����� */ private boolean needResume; @Override public boolean onInfo(MediaPlayer arg0, int arg1, int arg2) { switch (arg1) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: //��ʼ���棬��ͣ���� if (isPlaying()) { stopPlayer(); needResume = true; } mLoadingView.setVisibility(View.VISIBLE); mMediaController.setEnabled(false); break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: //������ɣ��������� if (needResume) startPlayer(); mLoadingView.setVisibility(View.GONE); mMediaController.setEnabled(true); break; case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED: //��ʾ �����ٶ� download_string =Integer.toString(arg2)+"KB/S"; Message msg = mHandler.obtainMessage(); msg.what = 1; msg.sendToTarget(); break; } return true; } //���������仯 private void batteryLevel() { BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { context.unregisterReceiver(this); int rawlevel = intent.getIntExtra("level", -1);//��õ�ǰ���� int scale = intent.getIntExtra("scale", -1); //����ܵ��� int level = -1; if (rawlevel >= 0 && scale > 0) { level = (rawlevel * 100) / scale; } //����ͼ�ꡢ������ɫ�任 if(level>=50){ TextView_battery.setBackgroundResource(R.drawable.battery_green); TextView_battery.setTextColor(Color.rgb(0, 255, 0));//��ɫ } if(level>20 && level<50){ TextView_battery.setBackgroundResource(R.drawable.battery_yellow); TextView_battery.setTextColor(Color.rgb(255, 255, 0));//��ɫ } if(level<=20){ TextView_battery.setBackgroundResource(R.drawable.battery_red); TextView_battery.setTextColor(Color.rgb(255, 0, 0));//��ɫ } TextView_battery.setText(Integer.toString(level)); } }; IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); this.registerReceiver(batteryLevelReceiver, batteryLevelFilter); } //����ˢ��ʱ����߳� class myThread implements Runnable { public void run() { try { while(true){ SimpleDateFormat sdf=new SimpleDateFormat("yyyy��MM��dd�� HH:mm:ss"); String str=sdf.format(new Date()); mHandler.sendMessage(mHandler.obtainMessage(2,str)); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } } } public void exit(){ //�˳����� if (!isExit) { isExit = true; Toast.makeText(this, "�ٰ�һ���˳�����", Toast.LENGTH_SHORT).show(); mHandler.sendEmptyMessageDelayed(0, 2000); } else { onDestroy();//�ͷ���Դ�����˳����� this.finish(); } } //ˢ��״̬ Handler mHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what == 0){ //ˢ���˳�״̬ isExit = false; } if(msg.what == 1){ //ˢ�������ٶ� TextView_download.setText(download_string); } if(msg.what == 2){ //ˢ�µ�ǰʱ�� TextView_time.setText((String)msg.obj); } if(msg.what == 3){ mVolumeBrightnessLayout.setVisibility(View.GONE); } super.handleMessage(msg); } }; View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { // "����"��ť�Ĵ��� case R.id.SendButton: if (flag == false) { Toast.makeText(PlayVideo.this, "�ף��㻹û��¼�����ȵ�¼��", Toast.LENGTH_LONG).show(); return; } // ��ȡ�ͻ�������ķ������� chat_txt = messageEdit.getText().toString(); System.out.println(chat_txt.length()); if ((chat_txt != "")&&(chat_txt.length()>0)) { // �õ���ǰʱ�� Date now = new Date(System.currentTimeMillis()); SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss"); String nowStr = format.format(now); // ���ԣ�����������ͷ��Ե���Ϣ try { dataOutputStream.writeUTF("�û�:" + username + "\b\b\b" + nowStr + " ˵:" + chat_txt); } catch (IOException e2) { } } messageEdit.setText(""); break; } } }; // �ͻ����߳�������Ķ��� @Override public void run() { // ѭ��ִ�У�������һֱ�������������Ƿ�����Ϣ try { Thread.sleep(5000); } catch (InterruptedException e1) { e1.printStackTrace(); } while (true) { try { // ��ȡ��������������������Ϣ chat_in = dataInputStream.readUTF(); chat_in = chat_in + "\n"; // ����һ����Ϣ��Ҫ��ˢ�½��� mHandler1.sendMessage(mHandler1.obtainMessage()); } catch (IOException e) { } } } Handler mHandler1 = new Handler() { public void handleMessage(Message msg) { // ����Ϣ����ʾ�ڿͻ��˵ĶԻ������� historyEdit.append(chat_in); //�������������� historyEdit.setMovementMethod(ScrollingMovementMethod.getInstance()); historyEdit.setSelection(historyEdit.getText().length(), historyEdit.getText().length()); // ˢ�� super.handleMessage(msg); } }; public class SocketThread implements Runnable { //ʵ��Runnable�ӿ� public void run() { // ʵ��run���� try { // ����Socket���� socket = new Socket(ip, ServerThread.PORT); // �����ͻ����������룯����������ڶԷ������˷��ͻ�������� dataInputStream = new DataInputStream(socket .getInputStream()); dataOutputStream = new DataOutputStream(socket .getOutputStream()); // �õ�ϵͳ��ʱ�� Date now = new Date(System.currentTimeMillis()); SimpleDateFormat format = new SimpleDateFormat( "hh:mm:ss"); String nowStr = format.format(now); // ���ijij������ dataOutputStream.writeUTF("�û�" + username + "\b" + nowStr + " ��������"); } catch (IOException e1) { System.out.println("��Ǹ���Ӳ��ɹ�������"); } } } }