实例介绍
【实例简介】
Demo程序提供的是网络摄像机的基础功能演示,所需要的so文件请到IPCamerDemo\libs\armeabi 目录下提取;
此外调用so文件时包名一定为:object.p2pipcam.nativecaller 否则调用无效。
【实例截图】
【核心代码】
package com.ipcamer.demo; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; import vstc2.nativecaller.NativeCaller; 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.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.PointF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.util.FloatMath; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.Window; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import com.ipcamer.demo.BridgeService.PlayInterface; public class PlayActivity extends Activity implements OnTouchListener, OnGestureListener, OnClickListener, PlayInterface { private static final String LOG_TAG = "PlayActivity"; private static final int FULLSCREEN = 0; private static final int STANDARD = 1; private static final int MAGNIFY = 2; private int playmode = 1; private static final int AUDIO_BUFFER_START_CODE = 0xff00ff; private SurfaceView playSurface = null; private SurfaceHolder playHolder = null; private byte[] videodata = null; private int videoDataLen = 0; private int nVideoWidth = 0; private int nVideoHeight = 0; public int nVideoWidths = 0; //public byte[] videodatas = null; public int nVideoHeights = 0; private View progressView = null; private boolean bProgress = true; private GestureDetector gt = new GestureDetector(this); @SuppressWarnings("unused") private int nSurfaceHeight = 0; private int nResolution = 0; private int nBrightness = 0; private int nContrast = 0; @SuppressWarnings("unused") private int nMode = 0; @SuppressWarnings("unused") private int nFlip = 0; @SuppressWarnings("unused") private int nFramerate = 0; private boolean bInitCameraParam = false; private boolean bManualExit = false; private TextView textosd = null; private String strName = null;; private String strDID = null;; private int streamType = ContentCommon.MJPEG_SUB_STREAM; private PopupWindow popupWindow_about = null; private View osdView = null; private boolean bDisplayFinished = true; private surfaceCallback videoCallback = new surfaceCallback(); private int nPlayCount = 0; private CustomBuffer AudioBuffer = null; private AudioPlayer audioPlayer = null; private boolean bAudioStart = false; private int nStreamCodecType; private int nP2PMode = ContentCommon.PPPP_MODE_P2P_NORMAL; private TextView textTimeoutTextView = null; private boolean bTimeoutStarted = false; private int nTimeoutRemain = 180; private boolean isTakeVideo = false; private boolean isLeftRight = false; private boolean isUpDown = false; private PopupWindow mPopupWindowProgress; private final int BRIGHT = 1; private final int CONTRAST = 2; private boolean isHorizontalMirror = false; private boolean isVerticalMirror = false; private boolean isUpDownPressed = false; private boolean isShowtoping = false; private ImageView vidoeView; private ImageView videoViewStandard; private ImageButton ptzAudio; private ImageButton ptzPlayMode; private Button ptzResolutoin; private Animation showAnim; private boolean isTakepic = false; private boolean isMcriophone = false; private boolean isExit = false; private PopupWindow resolutionPopWindow; private Animation dismissAnim; private View ptzOtherSetAnimView; private int timeTag = 0; private int timeOne = 0; private int timeTwo = 0; private ImageButton button_back; private BitmapDrawable drawable = null; // private LinkedList<byte[]> bs = null; private MyBrodCast brodCast = null; class MyBrodCast extends BroadcastReceiver { @Override public void onReceive(Context arg0, Intent arg1) { if (arg1.getIntExtra("ifdrop", 2) != 2) { PPPPMsgHandler.sendEmptyMessage(1004); } } } /** * 在UI线程中刷新界面状态 * **/ private Handler PPPPMsgHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1004: Toast.makeText(PlayActivity.this, "相机断线", 0).show(); PlayActivity.this.finish(); break; default: break; } } }; private class surfaceCallback implements SurfaceHolder.Callback { public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (holder == playHolder) { streamType = 10; NativeCaller.StartPPPPLivestream(strDID, streamType); } } public void surfaceCreated(SurfaceHolder holder) { } public void surfaceDestroyed(SurfaceHolder holder) { // finish(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mPopupWindowProgress != null && mPopupWindowProgress.isShowing()) { mPopupWindowProgress.dismiss(); } if (resolutionPopWindow != null && resolutionPopWindow.isShowing()) { resolutionPopWindow.dismiss(); } if (keyCode == KeyEvent.KEYCODE_BACK) { if (!bProgress) { Date date = new Date(); if (timeTag == 0) { timeOne = date.getSeconds(); timeTag = 1; Toast.makeText(PlayActivity.this, R.string.main_show_back, 0).show(); } else if (timeTag == 1) { timeTwo = date.getSeconds(); if (timeTwo - timeOne <= 3) { Intent intent = new Intent("finish"); sendBroadcast(intent); PlayActivity.this.finish(); timeTag = 0; } else { timeTag = 1; Toast.makeText(PlayActivity.this, R.string.main_show_back, 0).show(); } } } else { showSureDialog1(); } return true; } if (keyCode == KeyEvent.KEYCODE_MENU) { if (!bProgress) { showTop(); showBottom(); } else { showSureDialog1(); } } return super.onKeyDown(keyCode, event); } /**** * 退出确定dialog * */ public void showSureDialog1() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.app); builder.setTitle(getResources().getString(R.string.exit) getResources().getString(R.string.app_name)); builder.setMessage(R.string.exit_alert); builder.setPositiveButton(R.string.str_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Process.killProcess(Process.myPid()); Intent intent = new Intent("finish"); sendBroadcast(intent); PlayActivity.this.finish(); } }); builder.setNegativeButton(R.string.str_cancel, null); builder.show(); } private void showTop() { if (isShowtoping) { isShowtoping = false; topbg.setVisibility(View.GONE); topbg.startAnimation(dismissTopAnim); } else { isShowtoping = true; topbg.setVisibility(View.VISIBLE); topbg.startAnimation(showTopAnim); } } private void defaultVideoParams() { nBrightness = 1; nContrast = 128; NativeCaller.PPPPCameraControl(strDID, 1, 0); NativeCaller.PPPPCameraControl(strDID, 2, 128); showToast(R.string.ptz_default_vedio_params); } private void showToast(int i) { Toast.makeText(PlayActivity.this, i, 0).show(); } private void updateTimeout() { textTimeoutTextView.setText(getString(R.string.p2p_relay_mode_time_out) nTimeoutRemain getString(R.string.str_second)); } private Handler timeoutHandle = new Handler() { public void handleMessage(Message msg) { if (nTimeoutRemain > 0) { nTimeoutRemain = nTimeoutRemain - 1; updateTimeout(); Message msgMessage = new Message(); timeoutHandle.sendMessageDelayed(msgMessage, 1000); } else { if (!isExit) { Toast.makeText(getApplicationContext(), R.string.p2p_view_time_out, Toast.LENGTH_SHORT) .show(); } finish(); } } }; private void startTimeout() { if (!bTimeoutStarted) { Message msgMessage = new Message(); timeoutHandle.sendMessageDelayed(msgMessage, 1000); bTimeoutStarted = true; } } private void setViewVisible() { if (bProgress) { bProgress = false; progressView.setVisibility(View.INVISIBLE); osdView.setVisibility(View.VISIBLE); if (nP2PMode == ContentCommon.PPPP_MODE_P2P_RELAY) { updateTimeout(); textTimeoutTextView.setVisibility(View.VISIBLE); startTimeout(); } getCameraParams(); } } private Bitmap mBmp; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1 || msg.what == 2) { setViewVisible(); } if (!isPTZPrompt) { isPTZPrompt = true; showToast(R.string.ptz_control); } switch (msg.what) { case 1: // h264 { byte[] rgb = new byte[nVideoWidths * nVideoHeights * 2]; NativeCaller.YUV4202RGB565(videodata, rgb, nVideoWidths, nVideoHeights); ByteBuffer buffer = ByteBuffer.wrap(rgb); rgb = null; /* ByteBuffer buffer = ByteBuffer.wrap(videodata); */ mBmp = Bitmap.createBitmap(nVideoWidths, nVideoHeights, Bitmap.Config.RGB_565); mBmp.copyPixelsFromBuffer(buffer); int width = getWindowManager().getDefaultDisplay().getWidth(); int height = getWindowManager().getDefaultDisplay().getHeight(); vidoeView.setVisibility(View.GONE); Bitmap bitmap = null; if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( nVideoWidths, nVideoHeights * 3 / 4); lp.gravity = Gravity.CENTER; myGlSurfaceView.setLayoutParams(lp); bitmap = Bitmap.createScaledBitmap(mBmp, 320, 240, true); Log.i("info", "竖屏"); } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( width, height); lp.gravity = Gravity.CENTER; myGlSurfaceView.setLayoutParams(lp); bitmap = Bitmap .createScaledBitmap(mBmp, width, height, true); Log.i("info", "横屏"); } // myRender.writeSample(videodata, nVideoWidth, nVideoHeight); // videoViewStandard.setVisibility(View.GONE); // vidoeView.setImageBitmap(mBmp); videoViewStandard.setImageBitmap(bitmap); videoViewStandard.setVisibility(View.VISIBLE); playSurface.setBackgroundColor(0xff000000); // Drawable drawable = new BitmapDrawable(bitmap); // playSurface.setBackgroundDrawable(drawable); } break; case 2: // JPEG { // ptzTakeVideo.setVisibility(View.GONE); myGlSurfaceView.setVisibility(View.GONE); mBmp = BitmapFactory .decodeByteArray(videodata, 0, videoDataLen); if (mBmp == null) { Log.d(LOG_TAG, "bmp can't be decode..."); bDisplayFinished = true; return; } nVideoWidth = mBmp.getWidth(); nVideoHeight = mBmp.getHeight(); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { videoViewStandard.setVisibility(View.GONE); vidoeView.setVisibility(View.VISIBLE); vidoeView.setImageBitmap(mBmp); } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { videoViewStandard.setImageBitmap(mBmp); videoViewStandard.setVisibility(View.VISIBLE); vidoeView.setVisibility(View.GONE); } if (isTakepic) { isTakepic = false; // takePicture(mBmp); } } break; case 3: // { displayResolution(); } break; } if (msg.what == 1 || msg.what == 2) { // showTimeStamp(); bDisplayFinished = true; nPlayCount ; if (nPlayCount >= 100) { nPlayCount = 0; } } } }; protected void displayResolution() { /* * 0->640x480 1->320x240 2->160x120; 3->1280x720 4->640x360 5->1280x960 */ String strCurrResolution = null; switch (nResolution) { case 0:// vga strCurrResolution = "640x480"; break; case 1:// qvga strCurrResolution = "320x240"; break; case 2: strCurrResolution = "160x120"; break; case 3:// 720p strCurrResolution = "1280x720"; break; case 4: strCurrResolution = "640x360"; break; case 5: strCurrResolution = "1280x960"; break; default: return; } } public void initExitPopupWindow2() { LayoutInflater li = LayoutInflater.from(this); View popv = li.inflate(R.layout.popup_d, null); Button button_load = (Button) popv.findViewById(R.id.add_check_load); Button button_phone = (Button) popv.findViewById(R.id.add_check_phone); popupWindow_about = new PopupWindow(popv, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); popupWindow_about.setAnimationStyle(R.style.AnimationPreview); popupWindow_about.setFocusable(true); popupWindow_about.setOutsideTouchable(true); popupWindow_about.setBackgroundDrawable(new ColorDrawable(0)); button_load.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { NativeCaller.PPPPCameraControl(SystemValue.deviceId, 36, 36); popupWindow_about.dismiss(); ptzResolutoin.setText("VGA"); Log.d("VGA", "VGA"); } }); button_phone.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { NativeCaller.PPPPCameraControl(SystemValue.deviceId, 37, 37); popupWindow_about.dismiss(); ptzResolutoin.setText("QVGA"); Log.d("VGA", "QVGA"); } }); popupWindow_about .setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { // TODO Auto-generated method stub popupWindow_about.dismiss(); } }); popupWindow_about.setTouchInterceptor(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { if (arg1.getAction() == MotionEvent.ACTION_OUTSIDE) { popupWindow_about.dismiss(); } return false; } }); } private void getCameraParams() { NativeCaller.PPPPGetSystemParams(strDID, ContentCommon.MSG_TYPE_GET_CAMERA_PARAMS); } private Handler msgHandler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { Log.d("tag", "断线了"); Toast.makeText(getApplicationContext(), R.string.pppp_status_disconnect, Toast.LENGTH_SHORT) .show(); finish(); } } }; private Handler msgStreamCodecHandler = new Handler() { public void handleMessage(Message msg) { if (nStreamCodecType == ContentCommon.PPPP_STREAM_TYPE_JPEG) { // textCodec.setText("JPEG"); } else { // textCodec.setText("H.264"); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // getDataFromOther(); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.play); strName = SystemValue.deviceName; strDID = SystemValue.deviceId; findView(); InitParams(); AudioBuffer = new CustomBuffer(); audioPlayer = new AudioPlayer(AudioBuffer); // myvideoRecorder = new CustomVideoRecord(this, strDID); BridgeService.setPlayInterface(this); playHolder = playSurface.getHolder(); playHolder.setFormat(PixelFormat.RGB_565); playHolder.addCallback(videoCallback); playSurface.setOnTouchListener(this); playSurface.setLongClickable(true); getCameraParams(); dismissTopAnim = AnimationUtils.loadAnimation(this, R.anim.ptz_top_anim_dismiss); showTopAnim = AnimationUtils.loadAnimation(this, R.anim.ptz_top_anim_show); showAnim = AnimationUtils.loadAnimation(this, R.anim.ptz_otherset_anim_show); dismissAnim = AnimationUtils.loadAnimation(this, R.anim.ptz_otherset_anim_dismiss); // prompt user how to control ptz when first enter play SharedPreferences sharePreferences = getSharedPreferences("ptzcontrol", MODE_PRIVATE); isPTZPrompt = sharePreferences.getBoolean("ptzcontrol", false); if (!isPTZPrompt) { Editor edit = sharePreferences.edit(); edit.putBoolean("ptzcontrol", true); edit.commit(); } initExitPopupWindow2(); brodCast = new MyBrodCast(); IntentFilter filter = new IntentFilter(); filter.addAction("drop"); PlayActivity.this.registerReceiver(brodCast, filter); } private void InitParams() { DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); nSurfaceHeight = dm.heightPixels; textosd.setText(strName); } private void StartAudio() { synchronized (this) { AudioBuffer.ClearAll(); audioPlayer.AudioPlayStart(); NativeCaller.PPPPStartAudio(strDID); } } private void StopAudio() { synchronized (this) { audioPlayer.AudioPlayStop(); AudioBuffer.ClearAll(); NativeCaller.PPPPStopAudio(strDID); } } protected void setResolution(int Resolution) { Log.d("tag", "setResolution resolution:" Resolution); NativeCaller.PPPPCameraControl(strDID, 0, Resolution); } private void findView() { playSurface = (SurfaceView) findViewById(R.id.playSurface); playSurface.setBackgroundColor(0xff000000); button_back = (ImageButton) findViewById(R.id.login_top_back); myGlSurfaceView = (GLSurfaceView) findViewById(R.id.myhsurfaceview); myRender = new MyRender(myGlSurfaceView); myGlSurfaceView.setRenderer(myRender); imgUp = (ImageView) findViewById(R.id.imgup); imgDown = (ImageView) findViewById(R.id.imgdown); imgRight = (ImageView) findViewById(R.id.imgright); imgLeft = (ImageView) findViewById(R.id.imgleft); imgUp.setOnClickListener(this); imgDown.setOnClickListener(this); imgLeft.setOnClickListener(this); imgRight.setOnClickListener(this); button_back.setOnClickListener(this); vidoeView = (ImageView) findViewById(R.id.vedioview); videoViewStandard = (ImageView) findViewById(R.id.vedioview_standard); progressView = (View) findViewById(R.id.progressLayout); textosd = (TextView) findViewById(R.id.textosd); textTimeoutTextView = (TextView) findViewById(R.id.textTimeout); osdView = (View) findViewById(R.id.osdlayout); ptzHoriMirror2 = (ImageButton) findViewById(R.id.ptz_hori_mirror); ptzVertMirror2 = (ImageButton) findViewById(R.id.ptz_vert_mirror); ptzHoriTour2 = (ImageButton) findViewById(R.id.ptz_hori_tour); ptzVertTour2 = (ImageButton) findViewById(R.id.ptz_vert_tour); ptzAudio = (ImageButton) findViewById(R.id.ptz_audio); ImageButton ptzBrightness = (ImageButton) findViewById(R.id.ptz_brightness); ImageButton ptzContrast = (ImageButton) findViewById(R.id.ptz_contrast); ptzResolutoin = (Button) findViewById(R.id.ptz_resoluti); ptzPlayMode = (ImageButton) findViewById(R.id.ptz_playmode); ptzOtherSetAnimView = findViewById(R.id.ptz_othersetview_anim); ImageButton ptzDefaultSet = (ImageButton) findViewById(R.id.ptz_default_set); ptzHoriMirror2.setOnClickListener(this); ptzVertMirror2.setOnClickListener(this); ptzHoriTour2.setOnClickListener(this); ptzVertTour2.setOnClickListener(this); ptzAudio.setOnClickListener(this); ptzBrightness.setOnClickListener(this); ptzContrast.setOnClickListener(this); ptzResolutoin.setOnClickListener(this); ptzPlayMode.setOnClickListener(this); ptzDefaultSet.setOnClickListener(this); topbg = (RelativeLayout) findViewById(R.id.top_bg); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.top_bg); drawable = new BitmapDrawable(bitmap); drawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); drawable.setDither(true); topbg.setBackgroundDrawable(drawable); ptzOtherSetAnimView.setBackgroundDrawable(drawable); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mBaseMatrix = new Matrix(); mSuppMatrix = new Matrix(); mDisplayMatrix = new Matrix(); videoViewStandard.setImageMatrix(mDisplayMatrix); } private boolean isDown = false; private boolean isSecondDown = false; private float x1 = 0; private float x2 = 0; private float y1 = 0; private float y2 = 0; @Override public boolean onTouch(View v, MotionEvent event) { if (!isDown) { x1 = event.getX(); y1 = event.getY(); isDown = true; } switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); start.set(event.getX(), event.getY()); mode = DRAG; originalScale = getScale(); break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_UP: if (Math.abs((x1 - x2)) < 25 && Math.abs((y1 - y2)) < 25) { if (resolutionPopWindow != null && resolutionPopWindow.isShowing()) { resolutionPopWindow.dismiss(); } if (mPopupWindowProgress != null && mPopupWindowProgress.isShowing()) { mPopupWindowProgress.dismiss(); } if (!isSecondDown) { if (!bProgress) { showTop(); showBottom(); } } isSecondDown = false; } else { } x1 = 0; x2 = 0; y1 = 0; y2 = 0; isDown = false; break; case MotionEvent.ACTION_POINTER_DOWN: isSecondDown = true; oldDist = spacing(event); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; } break; case MotionEvent.ACTION_MOVE: x2 = event.getX(); y2 = event.getY(); int midx = getWindowManager().getDefaultDisplay().getWidth() / 2; int midy = getWindowManager().getDefaultDisplay().getHeight() / 2; if (mode == ZOOM) { float newDist = spacing(event); if (newDist > 0f) { float scale = newDist / oldDist; Log.d("scale", "scale:" scale); if (scale <= 2.0f && scale >= 0.2f) { // zoomTo(originalScale * scale, midx, midy); } } } } return gt.onTouchEvent(event); } private static final int NONE = 0; private static final int DRAG = 1; private static final int ZOOM = 2; private int mode = NONE; private float oldDist; private Matrix matrix = new Matrix(); private Matrix savedMatrix = new Matrix(); private PointF start = new PointF(); private PointF mid = new PointF(); float mMaxZoom = 2.0f; float mMinZoom = 0.3125f; float originalScale; float baseValue; protected Matrix mBaseMatrix = new Matrix(); protected Matrix mSuppMatrix = new Matrix(); private Matrix mDisplayMatrix = new Matrix(); private final float[] mMatrixValues = new float[9]; protected void zoomTo(float scale, float centerX, float centerY) { Log.d("zoomTo", "zoomTo scale:" scale); if (scale > mMaxZoom) { scale = mMaxZoom; } else if (scale < mMinZoom) { scale = mMinZoom; } float oldScale = getScale(); float deltaScale = scale / oldScale; Log.d("deltaScale", "deltaScale:" deltaScale); mSuppMatrix.postScale(deltaScale, deltaScale, centerX, centerY); videoViewStandard.setScaleType(ImageView.ScaleType.MATRIX); videoViewStandard.setImageMatrix(getImageViewMatrix()); } protected Matrix getImageViewMatrix() { mDisplayMatrix.set(mBaseMatrix); mDisplayMatrix.postConcat(mSuppMatrix); return mDisplayMatrix; } protected float getScale(Matrix matrix) { return getValue(matrix, Matrix.MSCALE_X); } protected float getScale() { return getScale(mSuppMatrix); } protected float getValue(Matrix matrix, int whichValue) { matrix.getValues(mMatrixValues); return mMatrixValues[whichValue]; } private float spacing(MotionEvent event) { try { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x y * y); } catch (Exception e) { } return 0; } private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) event.getX(1); float y = event.getY(0) event.getY(1); point.set(x / 2, y / 2); } @Override public boolean onDown(MotionEvent e) { Log.d("tag", "onDown"); return false; } private final int MINLEN = 80; private RelativeLayout topbg; private Animation showTopAnim; private Animation dismissTopAnim; private ImageButton ptzHoriMirror2; private ImageButton ptzVertMirror2; private ImageButton ptzHoriTour2; private ImageButton ptzVertTour2; private boolean isPTZPrompt; @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float x1 = e1.getX(); float x2 = e2.getX(); float y1 = e1.getY(); float y2 = e2.getY(); float xx = x1 > x2 ? x1 - x2 : x2 - x1; float yy = y1 > y2 ? y1 - y2 : y2 - y1; if (xx > yy) { if ((x1 > x2) && (xx > MINLEN)) {// left NativeCaller .PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_RIGHT); } else if ((x1 < x2) && (xx > MINLEN)) {// right NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_LEFT); } } else { if ((y1 > y2) && (yy > MINLEN)) {// down NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_DOWN); } else if ((y1 < y2) && (yy > MINLEN)) {// up NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_UP); } } return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } public void showSureDialogPlay() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.app); builder.setTitle(getResources().getString(R.string.exit_show)); builder.setMessage(R.string.exit_play_show); builder.setPositiveButton(R.string.str_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { PlayActivity.this.finish(); } }); builder.setNegativeButton(R.string.str_cancel, null); builder.show(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login_top_back: bManualExit = true; if (!bProgress) { if (isTakeVideo == true) { showToast(R.string.eixt_show_toast); } else { showSureDialogPlay(); } } break; case R.id.imgup: NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_UP); Log.d("tag", "up"); break; case R.id.imgdown: NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_DOWN); Log.d("tag", "down"); break; case R.id.imgleft: NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_LEFT); Log.d("tag", "left"); break; case R.id.imgright: NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_RIGHT); Log.d("tag", "right"); break; case R.id.ptz_hori_mirror: if (isHorizontalMirror) { ptzHoriMirror2.setBackgroundColor(0x00ffffff); isHorizontalMirror = false; NativeCaller.PPPPCameraControl(strDID, 5, ContentCommon.CMD_PTZ_ORIGINAL); Log.d("tag", "水平镜像还原:" ContentCommon.CMD_PTZ_ORIGINAL); } else { isHorizontalMirror = true; ptzHoriMirror2.setBackgroundColor(0xff0044aa); NativeCaller.PPPPCameraControl(strDID, 5, ContentCommon.CMD_PTZ_HORIZONAL_MIRROR); Log.d("tag", "水平镜像:" ContentCommon.CMD_PTZ_HORIZONAL_MIRROR); } break; case R.id.ptz_vert_mirror: if (isVerticalMirror) { isVerticalMirror = false; ptzVertMirror2.setBackgroundColor(0x00ffffff); NativeCaller.PPPPCameraControl(strDID, 5, ContentCommon.CMD_PTZ_ORIGINAL); Log.d("tag", "垂直镜像还原:" ContentCommon.CMD_PTZ_ORIGINAL); } else { isVerticalMirror = true; ptzVertMirror2.setBackgroundColor(0xff0044aa); NativeCaller.PPPPCameraControl(strDID, 5, ContentCommon.CMD_PTZ_VERTICAL_MIRROR); Log.d("tag", "垂直镜像:" ContentCommon.CMD_PTZ_VERTICAL_MIRROR); } break; case R.id.ptz_hori_tour: if (isLeftRight) { ptzHoriTour2.setBackgroundColor(0x000044aa); isLeftRight = false; NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_LEFT_RIGHT_STOP); Log.d("tag", "水平巡视停止:" ContentCommon.CMD_PTZ_LEFT_RIGHT_STOP); } else { ptzHoriTour2.setBackgroundColor(0xff0044aa); isLeftRight = true; NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_LEFT_RIGHT); Log.d("tag", "水平巡视开始:" ContentCommon.CMD_PTZ_LEFT_RIGHT); } break; case R.id.ptz_vert_tour: if (isUpDown) { ptzVertTour2.setBackgroundColor(0x000044aa); isUpDown = false; NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_UP_DOWN_STOP); Log.d("tag", "垂直巡视停止:" ContentCommon.CMD_PTZ_UP_DOWN_STOP); } else { ptzVertTour2.setBackgroundColor(0xff0044aa); isUpDown = true; NativeCaller.PPPPPTZControl(strDID, ContentCommon.CMD_PTZ_UP_DOWN); Log.d("tag", "垂直巡视开始:" ContentCommon.CMD_PTZ_UP_DOWN); } break; case R.id.ptz_audio: dismissBrightAndContrastProgress(); if (!isMcriophone) { if (bAudioStart) { Log.d("tag", "没有声音"); bAudioStart = false; ptzAudio.setImageResource(R.drawable.ptz_audio_off); StopAudio(); } else { Log.d("tag", "有声音"); bAudioStart = true; ptzAudio.setImageResource(R.drawable.ptz_audio_on); StartAudio(); } } break; case R.id.ptz_brightness: if (mPopupWindowProgress != null && mPopupWindowProgress.isShowing()) { mPopupWindowProgress.dismiss(); mPopupWindowProgress = null; } setBrightOrContrast(BRIGHT); break; case R.id.ptz_contrast: if (mPopupWindowProgress != null && mPopupWindowProgress.isShowing()) { mPopupWindowProgress.dismiss(); mPopupWindowProgress = null; } setBrightOrContrast(CONTRAST); break; case R.id.ptz_resoluti: popupWindow_about.showAtLocation(button_back, Gravity.CENTER, 0, 0); break; case R.id.ptz_resolution_jpeg_qvga: dismissBrightAndContrastProgress(); resolutionPopWindow.dismiss(); nResolution = 1; setResolution(nResolution); Log.d("tag", "jpeg resolution:" nResolution " qvga"); break; case R.id.ptz_resolution_jpeg_vga: dismissBrightAndContrastProgress(); resolutionPopWindow.dismiss(); nResolution = 0; setResolution(nResolution); Log.d("tag", "jpeg resolution:" nResolution " vga"); break; case R.id.ptz_resolution_h264_qvga: dismissBrightAndContrastProgress(); resolutionPopWindow.dismiss(); nResolution = 1; setResolution(nResolution); Log.d("tag", "h264 resolution:" nResolution " qvga"); break; case R.id.ptz_resolution_h264_vga: dismissBrightAndContrastProgress(); resolutionPopWindow.dismiss(); nResolution = 0; setResolution(nResolution); Log.d("tag", "h264 resolution:" nResolution " vga"); break; case R.id.ptz_resolution_h264_720p: dismissBrightAndContrastProgress(); resolutionPopWindow.dismiss(); nResolution = 3; setResolution(nResolution); Log.d("tag", "h264 resolution:" nResolution " 720p"); break; case R.id.ptz_playmode: dismissBrightAndContrastProgress(); switch (playmode) { case FULLSCREEN: ptzPlayMode.setImageResource(R.drawable.ptz_playmode_enlarge); ptzPlayMode .setBackgroundResource(R.drawable.ptz_takepic_selector); Log.d("tg", "magnify 1"); playmode = STANDARD; break; case MAGNIFY: Log.d("tg", "STANDARD 2"); playmode = FULLSCREEN; ptzPlayMode.setImageResource(R.drawable.ptz_playmode_standard); ptzPlayMode .setBackgroundResource(R.drawable.ptz_takepic_selector); break; case STANDARD: Log.d("tg", "FULLSCREEN 3"); playmode = MAGNIFY; ptzPlayMode .setImageResource(R.drawable.ptz_playmode_fullscreen); ptzPlayMode .setBackgroundResource(R.drawable.ptz_takepic_selector); break; default: break; } break; case R.id.ptz_default_set: dismissBrightAndContrastProgress(); defaultVideoParams(); break; } } private void dismissBrightAndContrastProgress() { if (mPopupWindowProgress != null && mPopupWindowProgress.isShowing()) { mPopupWindowProgress.dismiss(); mPopupWindowProgress = null; } } private void showBottom() { if (isUpDownPressed) { isUpDownPressed = false; ptzOtherSetAnimView.startAnimation(dismissAnim); ptzOtherSetAnimView.setVisibility(View.GONE); } else { isUpDownPressed = true; ptzOtherSetAnimView.startAnimation(showAnim); ptzOtherSetAnimView.setVisibility(View.VISIBLE); } } private void setBrightOrContrast(final int type) { Log.i(LOG_TAG, "type:" type " bInitCameraParam:" bInitCameraParam); if (!bInitCameraParam) { return; } int width = getWindowManager().getDefaultDisplay().getWidth(); LinearLayout layout = (LinearLayout) LayoutInflater.from(this).inflate( R.layout.brightprogress, null); SeekBar seekBar = (SeekBar) layout.findViewById(R.id.brightseekBar1); seekBar.setMax(255); switch (type) { case BRIGHT: seekBar.setProgress(nBrightness); break; case CONTRAST: seekBar.setProgress(nContrast); break; default: break; } seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); switch (type) { case BRIGHT:// 亮度 nBrightness = progress; NativeCaller.PPPPCameraControl(strDID, BRIGHT, nBrightness); break; case CONTRAST:// 对比度 nContrast = progress; NativeCaller.PPPPCameraControl(strDID, CONTRAST, nContrast); break; default: break; } } @Override public void onStartTrackingTouch(SeekBar arg0) { } @Override public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) { } }); mPopupWindowProgress = new PopupWindow(layout, width / 2, 180); mPopupWindowProgress.showAtLocation(findViewById(R.id.play), Gravity.TOP, 0, 0); } private MyRender myRender = null; private GLSurfaceView myGlSurfaceView = null; private ImageView imgUp = null; private ImageView imgDown = null; private ImageView imgRight = null; private ImageView imgLeft = null; @Override protected void onDestroy() { NativeCaller.StopPPPPLivestream(strDID); StopAudio(); if (myRender != null) { myRender.destroyShaders(); } if (brodCast != null) { unregisterReceiver(brodCast); } Log.d("tag", "PlayActivity onDestroy"); super.onDestroy(); } /*** * BridgeService callback * * **/ @Override public void callBackCameraParamNotify(String did, int resolution, int brightness, int contrast, int hue, int saturation, int flip) { Log.d("info", "CameraParamNotify...did:" did " brightness: " brightness " resolution: " resolution " contrast: " contrast " hue: " hue " saturation: " saturation " flip: " flip); Log.d("tag", "contrast:" contrast " brightness:" brightness); nBrightness = brightness; nContrast = contrast; nResolution = resolution; Log.d("VGA", nResolution ""); runOnUiThread(new Runnable() { @Override public void run() { if (nResolution == 0) { // vga ptzResolutoin.setText("VGA"); } else if (nResolution == 3) { // 720 ptzResolutoin.setText("720P"); } else if (nResolution == 1) { // 720 ptzResolutoin.setText("QVGA"); } } }); Message msg = new Message(); msg.what = 3; mHandler.sendMessage(msg); bInitCameraParam = true; } /*** * BridgeService callback * * **/ @Override public void callBaceVideoData(byte[] videobuf, int h264Data, int len, int width, int height) { Log.d("info", "Call VideoData...h264Data: " h264Data " len: " len " videobuf len: " videobuf.length "width==" nVideoWidth "height==" nVideoHeight); if (!bDisplayFinished) { Log.d("info", "return bDisplayFinished"); return; } bDisplayFinished = false; videodata = videobuf; videoDataLen = len; nVideoWidths = width; nVideoHeights = height; Message msg = new Message(); if (h264Data == 1) { // H264 Log.i("info","h264Data...."); if (isTakepic) { isTakepic = false; byte[] rgb = new byte[width * height * 2]; NativeCaller.YUV4202RGB565(videobuf, rgb, width, height); ByteBuffer buffer = ByteBuffer.wrap(rgb); mBmp = Bitmap .createBitmap(width, height, Bitmap.Config.RGB_565); mBmp.copyPixelsFromBuffer(buffer); // takePicture(mBmp); } msg.what = 1; } else { // MJPEG Log.i("info","MJPEG...."); msg.what = 2; } mHandler.sendMessage(msg); } /*** * BridgeService callback * * **/ @Override public void callBackMessageNotify(String did, int msgType, int param) { Log.d("tag", "MessageNotify did: " did " msgType: " msgType " param: " param); if (bManualExit) return; if (msgType == ContentCommon.PPPP_MSG_TYPE_STREAM) { nStreamCodecType = param; Message msgMessage = new Message(); msgStreamCodecHandler.sendMessage(msgMessage); return; } if (msgType != ContentCommon.PPPP_MSG_TYPE_PPPP_STATUS) { return; } if (!did.equals(strDID)) { return; } Message msg = new Message(); msg.what = 1; msgHandler.sendMessage(msg); } /*** * BridgeService callback * * **/ @Override public void callBackAudioData(byte[] pcm, int len) { Log.d(LOG_TAG, "AudioData: len : " len); if (!audioPlayer.isAudioPlaying()) { return; } CustomBufferHead head = new CustomBufferHead(); CustomBufferData data = new CustomBufferData(); head.length = len; head.startcode = AUDIO_BUFFER_START_CODE; data.head = head; data.data = pcm; AudioBuffer.addData(data); } /*** * BridgeService callback * * **/ @Override public void callBackH264Data(byte[] h264, int type, int size) { Log.d("tag", "CallBack_H264Data" " type:" type " size:" size); } }
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论