国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 偷拍功能實現(手機關閉依然拍照)詳解及實例代碼

2019-12-12 04:19:47
字體:
來源:轉載
供稿:網友

 Android 偷拍功能/手機關閉能拍照

效果如下:

其實偷拍與偷錄實現方式是一樣的,都是使用到的WindowManager來繪制桌面小控件的原理。那我就不多說了…

一、首先我們需要一個SurfaceView:

<?xml version="1.0" encoding="utf-8"?><LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/small_window_layout"  android:layout_width="1dip"  android:layout_height="1dip"  >  <FrameLayout    android:id="@+id/percent"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:gravity="center"    /></LinearLayout>

二、然后進行的操作就是生產這個小控件了:

public PhotoWindowSmallView(Context context) {    super(context);    windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    LayoutInflater.from(context).inflate(R.layout.float_window_small, this);    View view = findViewById(R.id.small_window_layout);    viewWidth = view.getLayoutParams().width;    viewHeight = view.getLayoutParams().height;//    SurfaceView percentView = (SurfaceView) findViewById(R.id.percent);//    percentView.setText(MyWindowManager.getUsedPercentValue(context));  }  /**   * 將小懸浮窗的參數傳入,用于更新小懸浮窗的位置。   *   * @param params 小懸浮窗的參數   */  public void setParams(WindowManager.LayoutParams params) {    mParams = params;  }

三、那桌面控件有了,下面當然就是使用WindowManager添加到桌面上了:

 /**     * 創建一個小懸浮窗。初始位置為屏幕的右部中間位置。     *     * @param context 必須為應用程序的Context.     */    public void createSmallWindow(Context context) {      mContext = context;      WindowManager windowManager = getWindowManager(context);      int screenWidth = windowManager.getDefaultDisplay().getWidth();      int screenHeight = windowManager.getDefaultDisplay().getHeight();      if (smallWindow == null) {        smallWindow = new PhotoWindowSmallView(context);        if (smallWindowParams == null) {          smallWindowParams = new LayoutParams();          smallWindowParams.type = LayoutParams.TYPE_PHONE;          smallWindowParams.format = PixelFormat.RGBA_8888;          smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL              | LayoutParams.FLAG_NOT_FOCUSABLE;          smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;          smallWindowParams.width = PhotoWindowSmallView.viewWidth;          smallWindowParams.height = PhotoWindowSmallView.viewHeight;          smallWindowParams.x = screenWidth;          smallWindowParams.y = screenHeight / 2;        }        smallWindow.setParams(smallWindowParams);        windowManager.addView(smallWindow, smallWindowParams);        mSurfaceview = (FrameLayout) smallWindow.findViewById(R.id.percent);      }    }    /**     * 將小懸浮窗從屏幕上移除。     *     * @param context 必須為應用程序的Context.     */    public void removeSmallWindow(Context context) {      if (smallWindow != null) {        WindowManager windowManager = getWindowManager(context);        windowManager.removeView(smallWindow);        smallWindow = null;      }    }

四、這個時候我們需要的SurfaceView就有了,那么,怎么在后臺進行操作呢?自然而然就想到了Service了

在Service中執行桌面控件的操作:

 @Override  public int onStartCommand(Intent intent, int flags, int startId) {    myWindowManager = new MyPhotoWindowManager();    createWindow();    return super.onStartCommand(intent, flags, startId);  }  @Override  public void onDestroy() {    super.onDestroy();  }  private void createWindow() {    // 當前界面是桌面,且沒有懸浮窗顯示,則創建懸浮窗。    myWindowManager.removeSmallWindow(getApplicationContext());    myWindowManager.createSmallWindow(getApplicationContext());  }

五、在activity中對Service綁定,進行拍照的操作

private class MyServiceConn implements ServiceConnection {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {      // TODO Auto-generated method stub      binder = (PhotoWindowService.myServiceBinder) service;      if (isVedio) {        binder.startCarema();      } else {        binder.stopCarema();      }    }    @Override    public void onServiceDisconnected(ComponentName name) {      // TODO Auto-generated method stub    }  }

六、在Service中控制myWindowManager中的拍照的開始和結束

 public class myServiceBinder extends Binder {    public void startCarema() {      myWindowManager.startCarema();    }    public void stopCarema() {      myWindowManager.stopCarema();    }  }

七、在MyPhotoWindowManager開啟或終止拍照操作

 public void startCarema() {    itt = InitTimetoTakePic.getInstance(mContext);    itt.initView(mSurfaceview);    itt.start();  }  public void stopCarema() {    if (itt != null)      itt.releaseCarema();  }

八、在InitTimetoTakePic進行拍照的相關處理

package com.ddv.www.candidphotodemo;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PictureCallback;import android.os.Build;import android.os.Handler;import android.os.Message;import android.widget.FrameLayout;import java.io.File;import java.io.FileOutputStream;/** * 設置定時拍照功能 * * @author <p> *     創建定時拍照任務 *     cameraType 攝像頭 *     resolutionString 分辨率 *     tvSaveLocation 保存地址 *     etExtension 拓展名 *     cameraStart, 開始拍攝時間 *     cameraNumber, 拍攝次數 *     cameraStop 拍攝張數 */public class InitTimetoTakePic {  private static InitTimetoTakePic mInstance;  private static int cameraType = 1;  Context mContext;  static FrameLayout mSurfaceViewFrame;  private static Camera mCamera;  private static CameraPreview mPreview;  private static String resolutionString = "1920x1080";  private static String saveLocation = AppUtils.getSDCardPath();  private static String extension = "JPG";  private static String cameraStart = "1";  private static String cameraNumber = "1";  private static String cameraStop = "10";  private static int number = 0;  private static boolean clearVoice = false;  private Intent intent;  private InitTimetoTakePic(Context context) {    this.mContext = context;  }  public synchronized static InitTimetoTakePic getInstance(Context context) {    mInstance = null;    mInstance = new InitTimetoTakePic(context);    return mInstance;  }  public void initView(FrameLayout surfaceViewFrame) {    mSurfaceViewFrame = surfaceViewFrame;  }  /**   * 啟動定時拍照并上傳功能   */  Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {      switch (msg.what) {        case 1:          LogUtils.v("開始拍照");          initCarema();          break;        case 2:          if (mCamera == null) {            releaseCarema();            number = 0;            mHandler.removeCallbacksAndMessages(null);          } else {            if (number < Integer.valueOf(cameraStop)) {              mCamera.autoFocus(new AutoFocusCallback() {                @Override                public void onAutoFocus(boolean success, Camera camera) {                  // 從Camera捕獲圖片                  LogUtils.v("自動聚焦111" + success);                  try {                    mCamera.takePicture(null, null, mPicture);                    mHandler.sendEmptyMessageDelayed(1, Integer.valueOf(cameraNumber) * 1000);                  } catch (Exception e) {                    releaseCarema();                    mHandler.removeCallbacksAndMessages(null);                  }                }              });            } else {              releaseCarema();              number = 0;              mHandler.removeCallbacksAndMessages(null);            }          }          break;      }    }  };  public void start() {    mHandler.sendEmptyMessageDelayed(1, 1 * 1000); //7s 后開始啟動相機  }  private void initCarema() {    LogUtils.v("initCarema");    if (mCamera == null) {      LogUtils.v("camera=null");      mCamera = getCameraInstance();      mPreview = new CameraPreview(mContext, mCamera);      mSurfaceViewFrame.removeAllViews();      mSurfaceViewFrame.addView(mPreview);    }    LogUtils.v(mCamera == null ? "mCamera is null" : "mCamera is not null");    mCamera.startPreview();    mHandler.sendEmptyMessageDelayed(2, Integer.valueOf(cameraStart) * 1000); //3s后拍照  }  /**   * 檢測設備是否存在Camera硬件   */  private boolean checkCameraHardware(Context context) {    if (context.getPackageManager().hasSystemFeature(        PackageManager.FEATURE_CAMERA)) {      // 存在      return true;    } else {      // 不存在      return false;    }  }  /**   * 打開一個Camera   */  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)  public static Camera getCameraInstance() {    Camera c = null;    try {      c = Camera.open(cameraType);      c.setDisplayOrientation(90);      Camera.Parameters mParameters = c.getParameters();      //快門聲音      c.enableShutterSound(clearVoice);      //可以用得到當前所支持的照片大小,然后      //List<Size> ms = mParameters.getSupportedPictureSizes();      //mParameters.setPictureSize(ms.get(0).width, ms.get(0).height); //默認最大拍照取最大清晰度的照片      String[] xes = resolutionString.split("x");      // LogUtils.i("ms.get(0).width==>"+ms.get(0).width);      // LogUtils.i("ms.get(0).height==>"+ms.get(0).height);      // LogUtils.i("Integer.valueOf(xes[0])==>"+Integer.valueOf(xes[0]));      // LogUtils.i("Integer.valueOf(xes[1])==>"+Integer.valueOf(xes[1]));      mParameters.setPictureSize(Integer.valueOf(xes[0]), Integer.valueOf(xes[1])); //默認最大拍照取最大清晰度的照片      c.setParameters(mParameters);    } catch (Exception e) {      LogUtils.v("打開Camera失敗失敗");    }    return c;  }  private PictureCallback mPicture = new PictureCallback() {    @Override    public void onPictureTaken(byte[] data, Camera camera) {      // 獲取Jpeg圖片,并保存在sd卡上      String path = saveLocation;      File dirF = new File(path);      if (!dirF.exists()) {        dirF.mkdirs();      }      File pictureFile = new File(path + "/" + System.currentTimeMillis() + "." + extension);//擴展名      try {        FileOutputStream fos = new FileOutputStream(pictureFile);        fos.write(data);        fos.close();        LogUtils.v("保存圖成功");        number++;        intent = new Intent();        intent.setAction("CameraFragment.start");        intent.putExtra("number", number);        mContext.sendBroadcast(intent);      } catch (Exception e) {        LogUtils.v("保存圖片失敗");        e.printStackTrace();      }      releaseCarema();    }  };  public void releaseCarema() {    if (mCamera != null) {      mCamera.stopPreview();      mCamera.release();      mCamera = null;    }  }}

demo下載地址://m.survivalescaperooms.com/softs/519032.html

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆城县| 汨罗市| 建昌县| 运城市| 开原市| 肇源县| 雅江县| 上林县| 扎兰屯市| 石首市| 马山县| 婺源县| 碌曲县| 突泉县| 绿春县| 蕲春县| 霍邱县| 博爱县| 惠安县| 聂拉木县| 新巴尔虎左旗| 兴山县| 泽库县| 泰安市| 裕民县| 榕江县| 枝江市| 五台县| 建湖县| 罗江县| 德昌县| 贡觉县| 隆德县| 花莲县| 柯坪县| 霍城县| 铜陵市| 牟定县| 陕西省| 威远县| 牟定县|