android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx

上传人:b****6 文档编号:6678390 上传时间:2023-01-08 格式:DOCX 页数:12 大小:66.95KB
下载 相关 举报
android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx_第1页
第1页 / 共12页
android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx_第2页
第2页 / 共12页
android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx_第3页
第3页 / 共12页
android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx_第4页
第4页 / 共12页
android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx

《android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx》由会员分享,可在线阅读,更多相关《android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx(12页珍藏版)》请在冰豆网上搜索。

android不知不觉偷拍他人功能实现手机关闭依然拍照解析.docx

android不知不觉偷拍他人功能实现手机关闭依然拍照解析

android不知不觉偷拍他人功能实现(手机关闭依然拍照)

效果如下:

其实偷拍与偷录实现方式是一样的,都是使用到的WindowManager来绘制桌面小控件的原理。

那我就不多说了…

一、首先我们需要一个SurfaceView:

xmlversion="1.0"encoding="utf-8"?

>

xmlns:

android="

android:

id="@+id/small_window_layout"

android:

layout_width="1dip"

android:

layout_height="1dip"

>

android:

id="@+id/percent"

android:

layout_width="fill_parent"

android:

layout_height="fill_parent"

android:

gravity="center"

/>

二、然后进行的操作就是生产这个小控件了:

publicPhotoWindowSmallView(Contextcontext){

super(context);

windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);

LayoutInflater.from(context).inflate(R.layout.float_window_small,this);

Viewview=findViewById(R.id.small_window_layout);

viewWidth=view.getLayoutParams().width;

viewHeight=view.getLayoutParams().height;

//SurfaceViewpercentView=(SurfaceView)findViewById(R.id.percent);

//percentView.setText(MyWindowManager.getUsedPercentValue(context));

}

/**

*将小悬浮窗的参数传入,用于更新小悬浮窗的位置。

*

*@paramparams小悬浮窗的参数

*/

publicvoidsetParams(WindowManager.LayoutParamsparams){

mParams=params;

}

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

/**

*创建一个小悬浮窗。

初始位置为屏幕的右部中间位置。

*

*@paramcontext必须为应用程序的Context.

*/

publicvoidcreateSmallWindow(Contextcontext){

mContext=context;

WindowManagerwindowManager=getWindowManager(context);

intscreenWidth=windowManager.getDefaultDisplay().getWidth();

intscreenHeight=windowManager.getDefaultDisplay().getHeight();

if(smallWindow==null){

smallWindow=newPhotoWindowSmallView(context);

if(smallWindowParams==null){

smallWindowParams=newLayoutParams();

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);

}

}

/**

*将小悬浮窗从屏幕上移除。

*

*@paramcontext必须为应用程序的Context.

*/

publicvoidremoveSmallWindow(Contextcontext){

if(smallWindow!

=null){

WindowManagerwindowManager=getWindowManager(context);

windowManager.removeView(smallWindow);

smallWindow=null;

}

}

四、这个时候我们需要的SurfaceView就有了,那么,怎么在后台进行操作呢?

自然而然就想到了Service了

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

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

myWindowManager=newMyPhotoWindowManager();

createWindow();

returnsuper.onStartCommand(intent,flags,startId);

}

@Override

publicvoidonDestroy(){

super.onDestroy();

}

privatevoidcreateWindow(){

//当前界面是桌面,且没有悬浮窗显示,则创建悬浮窗。

myWindowManager.removeSmallWindow(getApplicationContext());

myWindowManager.createSmallWindow(getApplicationContext());

}

五、在activity中对Service绑定,进行拍照的操作

privateclassMyServiceConnimplementsServiceConnection{

@Override

publicvoidonServiceConnected(ComponentNamename,IBinderservice){

//TODOAuto-atedmethodstub

binder=(PhotoWindowService.myServiceBinder)service;

if(isVedio){

binder.startCarema();

}else{

binder.stopCarema();

}

}

@Override

publicvoidonServiceDisconnected(ComponentNamename){

//TODOAuto-generatedmethodstub

}

}

六、在Service中控制myWindowManager中的拍照的开始和结束

publicclassmyServiceBinderextendsBinder{

publicvoidstartCarema(){

myWindowManager.startCarema();

}

publicvoidstopCarema(){

myWindowManager.stopCarema();

}

}

七、在MyPhotoWindowManager开启或终止拍照操作

publicvoidstartCarema(){

itt=InitTimetoTakePic.getInstance(mContext);

itt.initView(mSurfaceview);

itt.start();

}

publicvoidstopCarema(){

if(itt!

=null)

itt.releaseCarema();

}

八、在InitTimetoTakePic进行拍照的相关处理

packagecom.ddv.www.candidphotodemo;

importandroid.annotation.TargetApi;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.pm.PackageManager;

importandroid.hardware.Camera;

importandroid.hardware.Camera.AutoFocusCallback;

importandroid.hardware.Camera.PictureCallback;

importandroid.os.Build;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.widget.FrameLayout;

importjava.io.File;

importjava.io.FileOutputStream;

/**

*设置定时拍照功能

*

*@author

*创建定时拍照任务

*cameraType摄像头

*resolutionString分辨率

*tvSaveLocation保存地址

*etExtension拓展名

*cameraStart,开始拍摄时间

*cameraNumber,拍摄次数

*cameraStop拍摄张数

*/

publicclassInitTimetoTakePic{

privatestaticInitTimetoTakePicmInstance;

privatestaticintcameraType=1;

ContextmContext;

staticFrameLayoutmSurfaceViewFrame;

privatestaticCameramCamera;

privatestaticCameraPreviewmPreview;

privatestaticStringresolutionString="1920x1080";

privatestaticStringsaveLocation=AppUtils.getSDCardPath();

privatestaticStringextension="JPG";

privatestaticStringcameraStart="1";

privatestaticStringcameraNumber="1";

privatestaticStringcameraStop="10";

privatestaticintnumber=0;

privatestaticbooleanclearVoice=false;

privateIntentintent;

privateInitTimetoTakePic(Contextcontext){

this.mContext=context;

}

publicsynchronizedstaticInitTimetoTakePicgetInstance(Contextcontext){

mInstance=null;

mInstance=newInitTimetoTakePic(context);

returnmInstance;

}

publicvoidinitView(FrameLayoutsurfaceViewFrame){

mSurfaceViewFrame=surfaceViewFrame;

}

/**

*启动定时拍照并上传功能

*/

HandlermHandler=newHandler(){

@Override

publicvoidhandleMessage(Messagemsg){

switch(msg.what){

case1:

LogUtils.v("开始拍照");

initCarema();

break;

case2:

if(mCamera==null){

releaseCarema();

number=0;

mHandler.removeCallbacksAndMessages(null);

}else{

if(number

mCamera.autoFocus(newAutoFocusCallback(){

@Override

publicvoidonAutoFocus(booleansuccess,Cameracamera){

//从Camera捕获图片

LogUtils.v("自动聚焦111"+success);

try{

mCamera.takePicture(null,null,mPicture);

mHandler.sendEmptyMessageDelayed(1,Integer.valueOf(cameraNumber)*1000);

}catch(Exceptione){

releaseCarema();

mHandler.removeCallbacksAndMessages(null);

}

}

});

}else{

releaseCarema();

number=0;

mHandler.removeCallbacksAndMessages(null);

}

}

break;

}

}

};

publicvoidstart(){

mHandler.sendEmptyMessageDelayed(1,1*1000);//7s后开始启动相机

}

privatevoidinitCarema(){

LogUtils.v("initCarema");

if(mCamera==null){

LogUtils.v("camera=null");

mCamera=getCameraInstance();

mPreview=newCameraPreview(mContext,mCamera);

mSurfaceViewFrame.removeAllViews();

mSurfaceViewFrame.addView(mPreview);

}

LogUtils.v(mCamera==null?

"mCameraisnull":

"mCameraisnotnull");

mCamera.startPreview();

mHandler.sendEmptyMessageDelayed(2,Integer.valueOf(cameraStart)*1000);//3s后拍照

}

/**

*检测设备是否存在Camera硬件

*/

privatebooleancheckCameraHardware(Contextcontext){

if(context.getPackageManager().hasSystemFeature(

PackageManager.FEATURE_CAMERA)){

//存在

returntrue;

}else{

//不存在

returnfalse;

}

}

/**

*打开一个Camera

*/

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)

publicstaticCameragetCameraInstance(){

Camerac=null;

try{

c=Camera.open(cameraType);

c.setDisplayOrientation(90);

Camera.ParametersmParameters=c.getParameters();

//快门声音

c.enableShutterSound(clearVoice);

//可以用得到当前所支持的照片大小,然后

//Listms=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(Exceptione){

LogUtils.v("打开Camera失败失败");

}

returnc;

}

privatePictureCallbackmPicture=newPictureCallback(){

@Override

publicvoidonPictureTaken(byte[]data,Cameracamera){

//获取Jpeg图片,并保存在sd卡上

Stringpath=saveLocation;

FiledirF=newFile(path);

if(!

dirF.exists()){

dirF.mkdirs();

}

FilepictureFile=newFile(path+"/"+System.currentTimeMillis()+"."+extension);//扩展名

try{

FileOutputStreamfos=newFileOutputStream(pictureFile);

fos.write(data);

fos.close();

LogUtils.v("保存图成功");

number++;

intent=newIntent();

intent.setAction("CameraFragment.start");

intent.putExtra("number",number);

mContext.sendBroadcast(intent);

}catch(Exceptione){

LogUtils.v("保存图片失败");

e.printStackTrace();

}

releaseCarema();

}

};

publicvoidreleaseCarema(){

if(mCamera!

=null){

mCamera.stopPreview();

mCamera.release();

mCamera=null;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1