Skip to content

JasonToJan/RemoteCamerawja

Repository files navigation

RemoteCamerawja

5.4 重新提交

远程Camera

==>项目要求:

1.适配api19到25,能够运行在通用的手机上 2.点对点连接,通过wifi热点 3.A端实现自定义Camera,功能有:拍照(指定位置区域拍照,矩形选择框,可放大缩小),相机参数的设置: 白平衡切换,对焦模式切换(自动对焦和指定位置对焦),ISO设置,曝光参数设置。 4.B端实现控制A端的操作,实现上述功能 5.拍照完成后返回拍照的图片显示在B端,并存储下来 6.B端再次打开可以预览之前的图片(以相册的形式,可以大图预览(图片缩放),查看图片信息等)

Ps:要求:屏幕三分之二区域是预览区域,B端有对应的三分之二区域,对焦情况下,触摸对应区域,A端对应区域对焦,区域拍照 的情况下,通过触摸移动,可以改变A端矩形区域位置,交互尽量友好,不能使用第三方框架,camera预览以及成像不能出现 变形拉伸。

==>效果截图:

1.A端效果预览1

2.A端效果预览2

3.B端控制效果预览1

4.B端控制效果预览2

5.AB端交互效果预览1

6.AB端交互效果预览2

==>实现难点:

1.A端相机部分

  ·相机的预览界面展示:自定义SurfaceView,实现SurfaceHolder.Callback接口

  ·相机对焦功能的实现,先将相机预览视图假定为【-1000,1000】的矩形,获取点击
      的坐标,然后计算相对比例,通过相机的params.setFocusAreas来设置对焦

  ·相机二指缩放效果:监听触摸事件,如果只有一个手指则实现对焦的功能,如果
      有两个手指,则返回手指之间的间距,通过params.setZoom来设置缩放

  ·区域拍照:自定义ImageView,特别注意区域的有效范围,和预览视图界面挂钩。
      设定最大和最小值,在onTouch事件中判断,随手指移动动态改变坐标,然后
      就是区域拍照的时候,图片裁剪问题,先缩放成屏幕大小,在根据坐标裁剪。

  ·三星手机图片旋转问题,在camera.tokePicture的回调中,先判断拍的照片的旋转
      角度,然后旋转之后再保存进文件。

  ·A端设置界面的实现,通过继承PreferenceFragment碎片,将需要设置的相机功能
      写进一个xml文件,通过一个函数传入mCamera实例和相机预览视图的实例动态
      改变预览效果。


2.A端图库部分
  ·批量加载多图
    这里获取到图片保存路径之后,得到图片路径的数组。
      通过GridView来显示缩略图,自定义适配器,异步加载图片(AsyncTask)
      监听滚动事件,释放非可见区域的图片资源

  ·大图浏览
      ViewPager分页加载,按照比例进行压缩
      自定义二指缩放的ImageView(ScaleGestureDetector获取多点触控的缩放比例)
	    (GestureDetector双击放大与缩小)
      查看图片详细信息(ExifInterface)


3.A端如何建立Socket连接
  ·A端在相机页面新建一个ServerScoket
    开启一个接受消息的线程,这个线程使用while(true)一致循环
    内部使用serverSocket.accep等待客户端连接,每一个客户端
    连接就创建了一个新的线程,传入一个handler参数用于界面的回调。

  ·A端的关键接收消息的线程就是ServerThread
      这是A端处理B端发送过来的消息的一个服务线程
      包括一个flag指令和message消息。
      这个flag是B端通过DataInputStream写进去的一个Short
      这个message是通过DataInputStream封装的byte数组转换的String

  ·A端建立发送消息的线程。
      包括几种类型,一种是发图片流,一种是普通消息,一种是特殊消息。
      这里的普通消息指一些反馈消息,特殊消息是指的发给B端有用的消息,
      比如A端区域坐标点位置,A端所有相机参数设置(Json字符串组合)


4.B端如何建立Socket连接
  ·B端首先需要创建一个接收消息的线程,根据A端IP地址和端口创建连接。
      获取消息的flag,根据flag来分情况处理消息。
      主要分为以下几种消息,照片回调,简单消息,特殊消息
      在该接收线程通过传入handler进行界面的交互。

  ·B端发送消息给A端,需要创建一个发送消息线程。
      这个消息线程同样封装了一个flag作为标志位
      还有一个message作为消息内容,所有的消息需要设置这两个参数

  ·处理逻辑:A端通过子线程发送消息(标志位+消息内容)
			B端通过子线程接收消息,根据标志位处理相应逻辑
			B端如果要通知A端,则通过子线程发送消息给B(标志位+消息内容)
			A端通过子线程接收消息,根据标志位下发到handler


5.B端如何进行区域拍照
  ·首先B端下发区域拍照请求给A端
      A端接收到请求,显示区域拍照,并计算左上角和右下角坐标。

  ·A端发送两个点坐标的相对位置(占预览图的百分比)
      B端接收到消息后,显示预览区,在预览区相对位置创建区域视图
      这个区域视图长度和宽度会动态改变。保证不越界。

  ·监听B端触摸事件,当合法的移动则发送移动点的坐标信息给A端

  ·A端接收到信息后,刷新区域视图的位置
     随着B端区域视图改变而改变,保证同步且不越界。


6.B端如何设置A端相机参数
  ·首先B端下发设置参数的请求给A端。

  ·A端接收到B端请求后,读取相机的参数,以json字符串的形式组合
      A端相机参数设置,然后发送消息到B端

  ·B端读取A端发送过来的消息,解析参数,然后设置到SharePrefrences文	件中。	在B端修改参数后,将发送消息给A端。
      发送的关键就是在B端也建立类似的PerferencesFragment
      在里面设置了一个监听器,当发生了改变,则监听器发送事件
      给B端控制页。

  ·A端接收到消息后,根据flag来设置相机相应的属性,根据	message来设置	属性的值。


7.待完善和待改进的地方
  ·改善连接方案,目前建立连接关系是通过外部主动连接到同一个wifi
      然后A端创建ServerSocket,B端根据A端的IP创建Socket连接
      所以这里有一定局限性,事先需要知道A端IP。

  ·增加连接方案,目前仅仅能够在wifi情况下能够互相通信,还可以在
      蓝牙或者热点(和wifi类似)的情况下建立通信。

  ·B端控制A端拍照的时候,无法实时预览到A端效果,所以触摸对焦和
      区域拍照没有实在的意义,下一步可以做实时的功能。

About

5.4 重新提交

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages