android控制手机强制手机横竖方向,使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)...
android IOIO是通过安卓手机的USB接口控制的电路板,通过android
IOIO可以不需要太多的硬件知识,通过安卓手机转接的IOIO板控制外围设备,配件有纸盒、L298N电机驱动模块、旧手机一部(系统必须在安卓2.3以上(与IOIO的固件有关)),旧手机电池两块,LED灯一组,USB线一根、减速电机带轮子
两个、万向轮一个、杜邦线6根左右就够了
先搭好硬件环境,然后进行安卓代码的编写,以下是代码:
视频传输部分参考了网上的代码
public
class SocketCameraActivity extends IOIOActivity implements
SurfaceHolder.Callback,
Camera.PreviewCallback{
private SurfaceView
mSurfaceview = null; // SurfaceView对象:(视图组件)视频显示
private
SurfaceHolder mSurfaceHolder = null; //
SurfaceHolder对象:(抽象接口)SurfaceView支持类
private Camera
mCamera = null; // Camera对象,相机预览
DigitalOutput
left,right,light;
ServerSocket
ser_socket;
Socket
cli_socket;
private String
pUsername="XZY";
private String
serverUrl="192.168.1.100";
private int
serverPort=8888;
private int
VideoPreRate=1;
private int
tempPreRate=0;
private int
VideoQuality=85;
private float
VideoWidthRatio=1;
private float
VideoHeightRatio=1;
private int
VideoWidth=320;
private int
VideoHeight=240;
private int
VideoFormatIndex=0;
private boolean
startSendVideo=false;
private boolean
connectedServer=false;
private Button
myBtn01, myBtn02;
@Override
public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//禁止屏幕休眠
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mSurfaceview = (SurfaceView)
findViewById(R.id.camera_preview);
myBtn01=(Button)findViewById(R.id.button1);
myBtn02=(Button)findViewById(R.id.button2);
ServerThread st=new ServerThread();
st.start();
//开始连接主机按钮
myBtn01.setOnClickListener(new
OnClickListener(){
public
void onClick(View v) {
//Common.SetGPSConnected(LoginActivity.this, false);
if(connectedServer){//停止连接主机,同时断开传输
startSendVideo=false;
connectedServer=false;
myBtn02.setEnabled(false);
myBtn01.setText("开始连接");
myBtn02.setText("开始传输");
//断开连接
Thread th = new
MySendCommondThread("PHONEDISCONNECT|"+pUsername+"|");
th.start();
}
else//连接主机
{
//启用线程发送命令PHONECONNECT
Thread th = new
MySendCommondThread("PHONECONNECT|"+pUsername+"|");
th.start();
connectedServer=true;
myBtn02.setEnabled(true);
myBtn01.setText("停止连接");
}
}});
myBtn02.setEnabled(false);
myBtn02.setOnClickListener(new
OnClickListener(){
public
void onClick(View v) {
if(startSendVideo)//停止传输视频
{
startSendVideo=false;
myBtn02.setText("开始传输");
}
else{ // 开始传输视频
startSendVideo=true;
myBtn02.setText("停止传输");
}
}});
}
@Override
public void
onStart()//重新启动的时候
{
mSurfaceHolder = mSurfaceview.getHolder(); //
绑定SurfaceView,取得SurfaceHolder对象
mSurfaceHolder.addCallback(this); //
SurfaceHolder加入回调接口
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//
设置显示器类型,setType必须设置
//读取配置文件
SharedPreferences preParas =
PreferenceManager.getDefaultSharedPreferences(SocketCameraActivity.this);
pUsername=preParas.getString("Username",
"XZY");
serverUrl=preParas.getString("ServerUrl",
"172.17.95.1");
String tempStr=preParas.getString("ServerPort",
"8888");
serverPort=Integer.parseInt(tempStr);
tempStr=preParas.getString("VideoPreRate",
"1");
VideoPreRate=Integer.parseInt(tempStr);
tempStr=preParas.getString("VideoQuality",
"85");
VideoQuality=Integer.parseInt(tempStr);
tempStr=preParas.getString("VideoWidthRatio",
"100");
VideoWidthRatio=Integer.parseInt(tempStr);
tempStr=preParas.getString("VideoHeightRatio",
"100");
VideoHeightRatio=Integer.parseInt(tempStr);
VideoWidthRatio=VideoWidthRatio/100f;
VideoHeightRatio=VideoHeightRatio/100f;
super.onStart();
}
@Override
protected void
onResume() {
super.onResume();
InitCamera();
}
private void
InitCamera(){
try{
mCamera =
Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void
onPause() {
super.onPause();
try{
if
(mCamera != null) {
mCamera.setPreviewCallback(null); // !!这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void
surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
{
// TODO Auto-generated method stub
if (mCamera == null) {
return;
}
mCamera.stopPreview();
mCamera.setPreviewCallback(this);
mCamera.setDisplayOrientation(90);
//设置横行录制
//获取摄像头参数
Camera.Parameters parameters =
mCamera.getParameters();
Size size =
parameters.getPreviewSize();
VideoWidth=size.width;
VideoHeight=size.height;
VideoFormatIndex=parameters.getPreviewFormat();
mCamera.startPreview();
}
@Override
public void
surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
if
(mCamera != null) {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void
surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if (null != mCamera) {
mCamera.setPreviewCallback(null); // !!这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera =
null;
}
}
@Override
public void
onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
//如果没有指令传输视频,就先不传
if(!startSendVideo)
return;
if(tempPreRate
tempPreRate++;
return;
}
tempPreRate=0;
try {
if(data!=null)
{
Log.d("YuvImage","success");
YuvImage image = new
YuvImage(data,VideoFormatIndex, VideoWidth,
VideoHeight,null);
if(image!=null)
{
ByteArrayOutputStream outstream = new
ByteArrayOutputStream();
//在此设置图片的尺寸和质量
image.compressToJpeg(new Rect(0, 0,
(int)(VideoWidthRatio*VideoWidth),
(int)(VideoHeightRatio*VideoHeight)), VideoQuality,
outstream);
outstream.flush();
//启用线程将图像数据发送出去
Thread th = new
MySendFileThread(outstream,pUsername,serverUrl,serverPort);
th.start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean
onCreateOptionsMenu(Menu menu)
{
menu.add(0,0,0,"系统设置");
menu.add(0,1,1,"关于程序");
menu.add(0,2,2,"退出程序");
return
super.onCreateOptionsMenu(menu);
}
public boolean
onOptionsItemSelected(MenuItem item)
{
super.onOptionsItemSelected(item);//获取菜单
switch(item.getItemId())//菜单序号
{
case
0:
//系统设置
{
Intent intent=new
Intent(this,SettingActivity.class);
startActivity(intent);
}
break;
case
1://关于程序
{
new
AlertDialog.Builder(this)
.setTitle("关于本程序")
.setMessage("遥控小车程序")
.setPositiveButton
(
"我知道了",
new
DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int
which)
{
}
}
)
.show();
}
break;
case
2://退出程序
{
//杀掉线程强制退出
android.os.Process.killProcess(android.os.Process.myPid());
}
break;
}
return true;
}
class
MySendCommondThread extends Thread{
private String commond;
public MySendCommondThread(String
commond){
this.commond=commond;
}
public void run(){
//实例化Socket
try
{
Socket socket=new
Socket(serverUrl,serverPort);
PrintWriter out = new
PrintWriter(socket.getOutputStream());
out.println(commond);
out.flush();
} catch
(UnknownHostException e) {
} catch
(IOException e) {
}
}
}
class
MySendFileThread extends Thread{
private String username;
private String ipname;
private int port;
private byte byteBuffer[] = new
byte[1024];
private OutputStream outsocket;
private ByteArrayOutputStream
myoutputstream;
public MySendFileThread(ByteArrayOutputStream
myoutputstream,String username,String ipname,int port){
this.myoutputstream = myoutputstream;
this.username=username;
this.ipname = ipname;
this.port=port;
try
{
myoutputstream.close();
} catch
(IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//将图像数据通过Socket发送出去
Socket tempSocket = new
Socket(ipname, port);
outsocket =
tempSocket.getOutputStream();
//写入头部数据信息
String
msg=java.net.URLEncoder.encode("PHONEVIDEO|"+username+"|","utf-8");
byte[] buffer=
msg.getBytes();
outsocket.write(buffer);
ByteArrayInputStream
inputstream = new
ByteArrayInputStream(myoutputstream.toByteArray());
int amount;
while ((amount =
inputstream.read(byteBuffer)) != -1) {
outsocket.write(byteBuffer, 0,
amount);
}
myoutputstream.flush();
myoutputstream.close();
tempSocket.close();
Log.d("MySendFileThread","success");
} catch
(IOException e) {
e.printStackTrace();
}
}
}
class Looper extends
BaseIOIOLooper {
@Override
protected void setup() throws
ConnectionLostException {
left=ioio_.openDigitalOutput(1);
right=ioio_.openDigitalOutput(2);
light=ioio_.openDigitalOutput(3);
left.write(true);
right.write(true);
light.write(true);
}
@Override
public void loop() throws
ConnectionLostException {
}
}
@Override
protected IOIOLooper
createIOIOLooper() {
return new Looper();
}
public void
go()
{
try {
left.write(false);
right.write(false);
} catch (ConnectionLostException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
public void
nstop()
{
try {
left.write(true);
right.write(true);
} catch (ConnectionLostException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
public void
goleft()
{
try {
left.write(false);
right.write(true);
} catch (ConnectionLostException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
public void
goright()
{
try {
left.write(true);
right.write(false);
} catch (ConnectionLostException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
public void
lightOn()
{
try {
light.write(false);
} catch (ConnectionLostException e) {
e.printStackTrace();
}
}
public void
lightOff()
{
try {
light.write(true);
} catch (ConnectionLostException e) {
e.printStackTrace();
}
}
class ServerThread
extends Thread
{
public void run()
{
try
{
ser_socket=new
ServerSocket(8000);
} catch
(IOException e) {
e.printStackTrace();
}
while
(true)
{
try {
cli_socket = ser_socket.accept();
Log.e("接受连接", "accept");
BufferedReader in = new BufferedReader(new
InputStreamReader(cli_socket.getInputStream()));
String str ="";
String temp;
while((temp=in.readLine())!=null)
{
str=str+temp;
Log.e("收到数据",temp);
if(temp.equals("lightOn"))
{
Log.d("收到","lightOn");
lightOn();
}
if(temp.equals("lightOff"))
{
lightOff();
}
if(temp.equals("go"))
{
go();
}
if(temp.equals("nstop"))
{
nstop();
}
if(temp.equals("goleft"))
{
goleft();
}
if(temp.equals("goright"))
{
goright();
}
}
}
catch (Exception
e)
{
e.printStackTrace();
}
finally
{
try
{
cli_socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
}
android控制手机强制手机横竖方向,使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)...相关推荐
- android是苹果手机吗,技术角度分析:这就是苹果手机和安卓手机为什么有差距的主要原因...
骁龙855跑分图 1.CPU方面:跑分来看,下一代高通处理器骁龙855处理器的单核心跑分跑不过A11处理器,多核心跑分终于持平了上代A11处理器:说简单点就是高通7nm工艺的处理器性能可以追平苹果10 ...
- 远程控制android盒子,实现远程控制监控安卓手机的向日葵UUPro使用评测,淘汰的安卓手机可以派上用场了...
实现远程控制监控安卓手机的向日葵UUPro使用评测,淘汰的安卓手机可以派上用场了 2021-05-18 20:31:33 14点赞 24收藏 14评论 创作立场声明:坚持真实客观评测,绝不因产品来源不 ...
- android usb设置在哪,手机usb调试在哪,小编教你安卓手机怎么打开USB调试
作为Android手机,如果我们需要将手机连接电脑传输文件.下载安装应用软件.备份文件甚至ROOT等,都需要打开手机的USB调试.可是每个手机的USB调试的位置和打开的方式都有所不同,不过最底层的An ...
- android手机病毒多杀毒,手机中毒不用慌!教你几招安卓手机怎么彻底的进行杀毒...
原标题:手机中毒不用慌!教你几招安卓手机怎么彻底的进行杀毒 手机如果中毒了,你知道要怎么彻底进行杀毒吗?今天我就和大家分享几个安卓手机彻底杀毒以及有效预防病毒的方法. 一.安卓手机彻底杀毒的方法 方法 ...
- Android连上USb不充电,为什么手机usb连不上电脑只显示充电 安卓手机解决方法
您可能感兴趣的话题: 手机 usb 核心提示:为什么手机usb连不上电脑只显示充电 安卓手机解决方法 经常遇到手机usb链接电脑后没有反应,但是显示手机充电,这种问题该怎么解决呢? 一般情况下,手机通 ...
- android 搜索不到wifi热点,新版wifi共享精灵xp安卓手机搜不到热点解决方法介绍
如果您安装了我们的新版wifi共享精灵软件启动成功,出现手机搜不到热点问题. 这里小编给大家综合一下你们的问题,最后来告诉大家怎么解决这个问题. 首先,我们要按三种常出现的情况讨论: XP系统--安卓 ...
- android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
在不久前举行的谷歌 I/O 大会上,谷歌为我们带来了智能穿戴系统 Android Wear,LG G Watch 以及三星 Gear Live 将率先支持 Android Wear.摩托罗拉发布了一段 ...
- android 开发清理内存_2019年 11 款最流行的安卓手机清理工具 总有一款适合你
1. Wondershare MobileGo Storage Cleaner Wondershare MobileGo Storage Cleaner是一款多功能的 Android APP管理器,具 ...
- android pixel 2,谷歌 Pixel 2 评测:目前最好的安卓手机
原标题:谷歌 Pixel 2 评测:目前最好的安卓手机 两周前,谷歌在旧金山举行发布会,推出了 Pixel 2 智能手机.现在,谷歌 Pixel 2 智能手机的首批媒体评测已经出炉.大部分评测都很正面 ...
最新文章
- 隧道接口工具airtun-ng
- SNMP OID是什么?
- 高清 网络摄像机 华为海思3510芯片
- python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
- 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
- 设置webhook_webhook工具实现
- 推理集 —— death
- 七句话道出做人的底线【精辟】
- SelectionKey 说 明
- Keil破解过程中注册机被识别为病毒文件
- 分享11个web前端开发实战项目案例+源码
- 牛客网项目里的数据表
- Linux实战——Shell编程练习(更新12题)
- 修改linux域名解析失败,kali 更新域名解析失败问题解决办法
- Less -- 初见less(Less介绍 初次使用less 使用考拉编译less 盒子居中)
- mac 破解安装 navicat
- php7 kernel32,usleep()
- 离子感烟探测器的工作原理介绍
- 红橙黄绿青蓝紫的html代码,红橙黄绿青蓝紫
- 高斯函数生成高斯模板(含Python代码实现)
热门文章
- 链接h5代码_H5域名被微信拦截的原因及解决方案?
- 在php中怎么引用已经定义过的变量,变量已经在方法中定义但执行的时候还报错?...
- 2021-03-07 Nussbaum函数
- LUOGU P4587 [FJOI2016]神秘数(主席树)
- 那些年,我们追过的java8
- Node.js环境搭建npm安装
- 唔... 突然发现进入推荐博客了
- Linux Shell 下载网站指定文件
- 安卓自动化测试——rf
- EasyUI-datagrid-自动合并单元格(转)