Android基于Socket无线遥控(1)--Socket基本模型搭建
16lz
2021-01-23
按计划每周更新一篇技术博文,上周因工作忙而中断,第三篇:《Android基于Socket无线遥控(1)--Socket基本模型搭建》
本例子内容比较多,初步构思分三篇完成,Android系统基于Socket实现无线遥控,可控制另一台Android设备音量增减、亮度调节、方向控制、确认、退出等,本篇主要介绍Socket基本模型搭建,以及无线控制Android系统音量增加,亮度增减。
一、技术介绍
1、Socket介绍
Socket技术实现,软件实现部分有客户端(遥控器)和服务器(显示器),服务器与客户端定制一致的收发消息信息,以致达到需求功能,主要使用步骤如下: a.服务器通过创建ServerSocket指定一个固定的端口号,以致客户端能够向该端口号发送连接请求; b.服务器通过accept()方法为下一个传入的连接请求创建Socket实例,如果没有新的连接请求,accept()方法将处于阻塞等待; c.客户端创建Socket,指定远程地址和端口号,向服务端发送请求; d.客户端与服务器连接成功后通过InputStream和OutputStream进行数据信息交互以达到无线遥控功能。
通常情况下,服务器端可能会接收多个客户端的请求,此时需要使用循环来接收来自不同客户端的连接请求,主要使用如下代码: [java] view plain copy
客户端创建Socket,指定服务端IP地址和端口号,当Socket创建成功后,服务端的ServerSocket的accept()方法会向下执行,此时服务器端和客户端产生一对相互连接的Socket,创建Socket代码如下: [java] view plain copy
当客户端与服务端产生对应的Socket之后,程序无需再区分服务端与客户端,而是通过各自的Socket进行通讯,主要采用Java IO流来进行数据信息传输,输入输出流方法乳如下: a.InputStream getInputStream() 返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据,主要使用之一: [java] view plain copy
b.OutputStream getOutputStream() 返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据,主要使用之一: [java] view plain copy
二、编码前预定准则
1、客户端(遥控器)、服务器(显示器)
2、端口:58888 (有效范围0~65535)
3、消息规则
a.客户端 --请求连接--> 服务器 消息:"CN" // CN为connect标志
b.客户端 --方向请求--> 服务器 消息: "DT" // 向上( direction Top) "DB" // 向下( bottom ) "DL" // 向左(Left) "DR" // 向右(Right) C.客户端 --音量增加、减少-->服务器 消息: "VO +" // 音量增加(v olume) "VO -" // 音量减少 D.客户端 --亮度增加、减少-->服务器 消息: "BR +" // 亮度增加( brightness) "BR -" // 亮度减少 E.客户端 --单击确认-->服务器 消息: "CL" // 单击确认(Click)
F.客户端 --菜单-->服务器 消息: "ME" // 取消(Menu l) G.客户端 --返回--> 服务器 消息: "BA" //退出(Back)
H.客户端 --电源--> 服务器 消息: "PO" // 电源(Power)
I.客户端 --Home--> 服务器 消息: "HO" //退出(Home)
三、编码实现 1.页面截图 a.遥控器简单界面 b.服务器端显示界面一 c.服务器端显示界面二 2.客户端(遥控器)主要代码 a. RemoteControlClient.java 遥控器客户端 [java] view plain copy
b. ClientThread.java 不断读取来自服务端的数据信息 [java] view plain copy
3.服务端(显示器)主要代码(ps. 部分功能未完成,下篇更新) a.MainActivity.java 服务端(显示器) [java] view plain copy
b.SocketService.java 服务端创建SocketService不断接收客户端连接请求 [java] view plain copy
d.ServerThread.java 主要负责服务端接收客户端的信息,并分配相应操作(未完成) [java] view plain copy
e.SystemManager.java 操作功能实现类,控制系统音量、系统亮度等(未完成) [java] view plain copy
f.WifiAdmin.java 与wifi相关类,可查询本机Wifi连接状态、IP地址、IP地址的int形式与IP显示形式转换 [java] view plain copy
g.Manifest.xml(配置文件)需要添加权限 [html] view plain copy
四、后记&下篇内容 本例中设置系统亮度未能很好的实现,每次设置亮度都会进行判断当前系统显示的Activty,而设置亮度目前需要到服务端界面设置才成功,所以退出服务端界面后,设置系统亮度会进行判断,如果当前不是显示服务端MainActivity,则在服务中重新打开。 下篇主要内容是模拟系统按键消息,单击事件,滚动事件等。 参考引用: 1.《李刚疯狂Android讲义》十三章 2.Android APIs: http://developer.android.com/reference/java/net/ServerSocket.html
本例子内容比较多,初步构思分三篇完成,Android系统基于Socket实现无线遥控,可控制另一台Android设备音量增减、亮度调节、方向控制、确认、退出等,本篇主要介绍Socket基本模型搭建,以及无线控制Android系统音量增加,亮度增减。
一、技术介绍
1、Socket介绍
Socket技术实现,软件实现部分有客户端(遥控器)和服务器(显示器),服务器与客户端定制一致的收发消息信息,以致达到需求功能,主要使用步骤如下: a.服务器通过创建ServerSocket指定一个固定的端口号,以致客户端能够向该端口号发送连接请求; b.服务器通过accept()方法为下一个传入的连接请求创建Socket实例,如果没有新的连接请求,accept()方法将处于阻塞等待; c.客户端创建Socket,指定远程地址和端口号,向服务端发送请求; d.客户端与服务器连接成功后通过InputStream和OutputStream进行数据信息交互以达到无线遥控功能。
通常情况下,服务器端可能会接收多个客户端的请求,此时需要使用循环来接收来自不同客户端的连接请求,主要使用如下代码: [java] view plain copy
- //创建一个ServerSocket,Ports为端口号
- ServerSocketss=newServerSocket(Ports);
- //采用循环不断接收来自客户端的请求
- while(!quit)
- {
- //此行代码会阻塞,将一直等待别人的连接
- Sockets=ss.accept();
- socketList.add(s);
- //每当客户端连接后启动一条ServerThread线程为该客户端服务
- newThread(newServerThread(s)).start();
- ……
- }
客户端创建Socket,指定服务端IP地址和端口号,当Socket创建成功后,服务端的ServerSocket的accept()方法会向下执行,此时服务器端和客户端产生一对相互连接的Socket,创建Socket代码如下: [java] view plain copy
- //创建Socket连接服务器,IP为IP地址,Ports为端口号
- Sockets=newSocket(IP,Ports);
- //客户端启动ClientThread线程不断读取来自服务器的数据
- newThread(newClientThread(s,handler)).start();
- ……
当客户端与服务端产生对应的Socket之后,程序无需再区分服务端与客户端,而是通过各自的Socket进行通讯,主要采用Java IO流来进行数据信息传输,输入输出流方法乳如下: a.InputStream getInputStream() 返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据,主要使用之一: [java] view plain copy
- ……
- BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()));
- ……
- Stringcontent=null;
- //不断读取Socket输入流中的内容。
- while((content=br.readLine())!=null)
- {
- //对接收到的信息进行对应操作
- }
b.OutputStream getOutputStream() 返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据,主要使用之一: [java] view plain copy
- ……
- OutputStreamos=socket.getOutputStream();
- StringOutputStr="";
- ……
- os.write(OutputStr+"\r\n").getBytes("utf-8"));
- ……
二、编码前预定准则
1、客户端(遥控器)、服务器(显示器)
2、端口:58888 (有效范围0~65535)
3、消息规则
a.客户端 --请求连接--> 服务器 消息:"CN" // CN为connect标志
b.客户端 --方向请求--> 服务器 消息: "DT" // 向上( direction Top) "DB" // 向下( bottom ) "DL" // 向左(Left) "DR" // 向右(Right) C.客户端 --音量增加、减少-->服务器 消息: "VO +" // 音量增加(v olume) "VO -" // 音量减少 D.客户端 --亮度增加、减少-->服务器 消息: "BR +" // 亮度增加( brightness) "BR -" // 亮度减少 E.客户端 --单击确认-->服务器 消息: "CL" // 单击确认(Click)
F.客户端 --菜单-->服务器 消息: "ME" // 取消(Menu l) G.客户端 --返回--> 服务器 消息: "BA" //退出(Back)
H.客户端 --电源--> 服务器 消息: "PO" // 电源(Power)
I.客户端 --Home--> 服务器 消息: "HO" //退出(Home)
三、编码实现 1.页面截图 a.遥控器简单界面 b.服务器端显示界面一 c.服务器端显示界面二 2.客户端(遥控器)主要代码 a. RemoteControlClient.java 遥控器客户端 [java] view plain copy
- /**
- *遥控器客户端
- *
- */
- publicclassRemoteControlClientextendsActivity
- {
- ……
- privateOutputStreamos;
- privateStringIP="192.168.2.10";//此IP地址根据实际项目修改
- privateintPorts=58888;//端口
- ……
- privateHandlerhandler=newHandler()
- {
- @Override
- publicvoidhandleMessage(Messagemsg)
- {
- //如果消息来自于子线程
- if(msg.what==0x123)
- {
- //将读取的内容追加显示在文本框中
- show.append(msg.obj.toString());
- }
- }
- };
- OnClickListenermOnClickListener=newOnClickListener()
- {
- @Override
- publicvoidonClick(Viewv)
- {
- switch(v.getId()){
- caseR.id.send:
- try
- {
- Log.v("","Socket--->input:"+input.getText().toString());
- //将用户在文本框内输入的内容写入网络
- os.write((input.getText().toString()+"\r\n").getBytes("utf-8"));
- //清空input文本框
- input.setText("");
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- }
- break;
- caseR.id.volume_add_btn:
- input.setText("VO+");
- break;
- caseR.id.volume_reduced_btn:
- input.setText("VO-");
- break;
- caseR.id.brightness_add_btn:
- input.setText("BR+");
- break;
- caseR.id.brightness_reduced_btn:
- input.setText("BR-");
- break;
- caseR.id.direction_top_btn:
- input.setText("DT");
- break;
- caseR.id.direction_bottom_btn:
- input.setText("DB");
- break;
- caseR.id.direction_left_btn:
- input.setText("DL");
- break;
- caseR.id.direction_right_btn:
- input.setText("DR");
- break;
- caseR.id.click_btn:
- input.setText("CL");
- break;
- caseR.id.back_btn:
- input.setText("BA");
- break;
- caseR.id.menu_btn:
- input.setText("ME");
- break;
- caseR.id.power_btn:
- input.setText("PO");
- break;
- caseR.id.home_btn:
- input.setText("HO");
- break;
- caseR.id.connect_btn:
- try
- {
- IP=ipInput.getText().toString();
- Log.v("","-->IP:"+IP);
- //创建Socket连接服务器
- Sockets=newSocket(IP,Ports);
- //客户端启动ClientThread线程不断读取来自服务器的数据
- newThread(newClientThread(s,handler)).start();os=s.getOutputStream();
- Toast.makeText(context,getString(R.string.con_success),Toast.LENGTH_LONG).show();
- reContentView();
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- Toast.makeText(context,getString(R.string.con_failed),Toast.LENGTH_LONG).show();
- }
- break;
- }
- }
- };
- }
b. ClientThread.java 不断读取来自服务端的数据信息 [java] view plain copy
- publicclassClientThreadimplementsRunnable
- {
- //该线程负责处理的Socket
- privateSockets;
- privateHandlerhandler;
- //该线程所处理的Socket所对应的输入流
- BufferedReaderbr=null;
- publicClientThread(Sockets,Handlerhandler)
- throwsIOException
- {
- this.s=s;
- this.handler=handler;
- br=newBufferedReader(newInputStreamReader(s.getInputStream()));
- }
- publicvoidrun()
- {
- try
- {
- Stringcontent=null;
- //不断读取Socket输入流中的内容。
- while((content=br.readLine())!=null)
- {
- //每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
- Messagemsg=newMessage();
- msg.what=0x123;
- msg.obj=content;
- handler.sendMessage(msg);
- }
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- }
- <uses-permissionandroid:name="android.permission.INTERNET"/>
3.服务端(显示器)主要代码(ps. 部分功能未完成,下篇更新) a.MainActivity.java 服务端(显示器) [java] view plain copy
- publicclassMainActivityextendsActivity{
- privateButtongetIpBtn;
- privatestaticTextViewshowTips;
- privateTextViewshowIp;
- privateWifiAdminwifi;
- publicstaticMainActivitymActivity;
- privateToggleButtonstartTB;
- privateIntentmIntent;
- privateintip;
- publicstaticSystemManagersystemManager=null;
- publicstaticfinalintCONN_SUCCESS=1;
- publicstaticfinalintCONN_ERROR=2;
- publicstaticfinalintSET_BRIGHTNESS=3;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mActivity=this;
- wifi=newWifiAdmin(getApplicationContext());
- ip=wifi.GetIPAddress();
- systemManager=newSystemManager();
- mIntent=newIntent();
- mIntent.setAction("com.example.socket.SERVICE");
- getIpBtn=(Button)findViewById(R.id.get_ip_btn);
- showTips=(TextView)findViewById(R.id.tips_tv);
- showIp=(TextView)findViewById(R.id.ip_tv);
- startTB=(ToggleButton)findViewById(R.id.socketStart);
- getIpBtn.setOnClickListener(mOnClickListener);
- startTB.setOnCheckedChangeListener(mOnCheckedChangeListener);
- }
- privateOnClickListenermOnClickListener=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- if(v==getIpBtn){
- ip=wifi.GetIPAddress();
- StringIP=WifiAdmin.longToIP(ip);
- showIp.setText("IP:"+IP);
- }
- }
- };
- //连接&断开Socket服务
- privateOnCheckedChangeListenermOnCheckedChangeListener=newOnCheckedChangeListener(){
- @Override
- publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
- if(buttonView==startTB){
- if(isChecked){
- startService(mIntent);
- }else{
- stopService(mIntent);
- mHandler.sendEmptyMessage(CONN_ERROR);
- }
- }
- }
- };
- publicstaticHandlermHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- super.handleMessage(msg);
- switch(msg.what){
- caseCONN_SUCCESS:
- StringsocketListStr="";
- intnum=1;
- for(Socketsocket:SocketService.socketList)
- {
- socketListStr+="\n------------------\n客户端"+num+++":"+socket;
- }
- showTips.setText(mActivity.getString(R.string.tips_conn_success)+socketListStr);
- break;
- caseCONN_ERROR:
- showTips.setText(R.string.tips_conn_wifi);
- break;
- caseSET_BRIGHTNESS:
- floatbrightness=(Float)msg.obj;
- SystemManager.setBrightness(MainActivity.mActivity,brightness);
- SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
- break;
- }
- }
- };
- }
b.SocketService.java 服务端创建SocketService不断接收客户端连接请求 [java] view plain copy
- /**
- *负责接收新的连接
- *以及控制系统的功能
- *@authorzzp
- *
- */
- publicclassSocketServiceextendsService{
- //定义保存所有Socket的ArrayList
- publicstaticArrayList<Socket>socketList=newArrayList<Socket>();
- privatebooleanquit=false;
- privateServerSocketss;
- privateintPorts=58888;//端口
- privatestaticSocketServicemService;
- @Override
- publicIBinderonBind(Intentintent){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidonCreate(){
- super.onCreate();
- Log.v("","SocketServiceonCreate");
- mService=this;
- newThread(mSocketRunnable).start();
- }
- /**
- *此线程等待新的客户端加入
- */
- RunnablemSocketRunnable=newRunnable(){
- @Override
- publicvoidrun(){
- try{
- ss=newServerSocket(Ports);
- while(!quit)
- {
- //此行代码会阻塞,将一直等待别人的连接
- Sockets=ss.accept();
- Log.v("","Socket--->s:"+s.toString());
- socketList.add(s);
- //每当客户端连接后启动一条ServerThread线程为该客户端服务
- newThread(newServerThread(s)).start();
- MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_SUCCESS);
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- };
- @Override
- publicvoidonDestroy(){
- super.onDestroy();
- quit=true;
- SocketService.socketList.clear();
- try{
- ss.close();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- Log.v("","SocketServiceonDestroy");
- }
- publicstaticfinalintSET_BRIGHTNESS=1;
- publicstaticHandlermHandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- super.handleMessage(msg);
- switch(msg.what){
- caseSET_BRIGHTNESS:
- //取得当前运行的Activity名字
- ActivityManageram=(ActivityManager)mService.getSystemService(ACTIVITY_SERVICE);
- ComponentNamecn=am.getRunningTasks(1).get(0).topActivity;
- Log.d("","pkg:"+cn.getPackageName());
- Log.d("","cls:"+cn.getClassName());
- Log.d("","MainActivity.class.getName():"+MainActivity.class.getName());
- if(!(cn.getClassName()).endsWith(MainActivity.class.getName())){
- Intenti=newIntent();
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.setClass(mService,MainActivity.class);
- mService.startActivity(i);
- }
- floatbrightness=(Float)msg.obj;
- SystemManager.setBrightness(MainActivity.mActivity,brightness);
- SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
- break;
- }
- }
- };
- }
d.ServerThread.java 主要负责服务端接收客户端的信息,并分配相应操作(未完成) [java] view plain copy
- /**
- *负责处理每个线程通信的线程类
- *
- */
- publicclassServerThreadimplementsRunnable
- {
- //定义当前线程所处理的Socket
- Sockets=null;
- //该线程所处理的Socket所对应的输入流
- BufferedReaderbr=null;
- /**
- *连接请求
- */
- publicstaticfinalStringOPERATION_CONNECT="CN";
- /**
- *方向
- */
- publicstaticfinalStringOPERATION_DIRECTION_TOP="DT";
- publicstaticfinalStringOPERATION_DIRECTION_BOTTOM="DB";
- publicstaticfinalStringOPERATION_DIRECTION_LEFT="DL";
- publicstaticfinalStringOPERATION_DIRECTION_RIGHT="DR";
- /**
- *音量
- */
- publicstaticfinalStringOPERATION_VOLUME="VO";
- /**
- *亮度
- */
- publicstaticfinalStringOPERATION_BRIGHTNESS="BR";
- /**
- *单击&确认
- */
- publicstaticfinalStringOPERATION_CLICK="CL";
- /**
- *菜单
- */
- publicstaticfinalStringOPERATION_MENU="ME";
- /**
- *返回
- */
- publicstaticfinalStringOPERATION_BACK="BA";
- /**
- *电源
- */
- publicstaticfinalStringOPERATION_POWER="PO";
- /**
- *Home
- */
- publicstaticfinalStringOPERATION_HOME="HO";
- publicServerThread(Sockets)
- throwsIOException
- {
- this.s=s;
- //初始化该Socket对应的输入流
- br=newBufferedReader(newInputStreamReader(s.getInputStream(),"utf-8"));//②
- }
- /**
- *向所有接入客户端发信息sendMessageToClient
- */
- publicsynchronizedstaticvoidsendMessageToClient(Stringmsg){
- Log.v("","sendMessageToClient-->:"+msg);
- //遍历socketList中的每个Socket,
- //将读到的内容向每个Socket发送一次
- for(Sockets:SocketService.socketList)
- {
- try{
- OutputStreamos=s.getOutputStream();
- os.write((msg+"\n").getBytes("utf-8"));
- }catch(IOExceptione){
- e.printStackTrace();
- Log.e("","-->sendMessageToClienterror<--删除该Socket:"+s);
- //删除该Socket。
- SocketService.socketList.remove(s);//①
- }
- }
- }
- /**
- *此线程不断接收客户端发过来的请求信息
- */
- publicvoidrun()
- {
- try
- {
- Stringcontent=null;
- //采用循环不断从Socket中读取客户端发送过来的数据
- while((content=readFromClient())!=null)
- {
- if(content.length()<2)continue;//避免发送空指令或错误指令导致异常
- StringrequestStr=content.substring(0,2);
- Log.v("","SocketServer--->content:"+content+",requestStr:"+requestStr);
- if(requestStr.endsWith(OPERATION_VOLUME)){
- MainActivity.systemManager.CtrlVolume(content);
- }elseif(requestStr.endsWith(OPERATION_BRIGHTNESS)){
- MainActivity.systemManager.CtrlBrightness(content);
- }
- //TODO未完成,下篇完成
- }
- }
- catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- /**
- *定义读取客户端数据的方法
- *@return接收到的请求信息
- */
- privateStringreadFromClient()
- {
- try
- {
- returnbr.readLine();
- }
- //如果捕捉到异常,表明该Socket对应的客户端已经关闭
- catch(IOExceptione)
- {
- //删除该Socket。
- SocketService.socketList.remove(s);
- MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_ERROR);
- }
- returnnull;
- }
- }
e.SystemManager.java 操作功能实现类,控制系统音量、系统亮度等(未完成) [java] view plain copy
- /**
- *控制系统的逻辑类
- *@authorzzp
- *
- */
- publicclassSystemManager{
- privateAudioManageraudioManager;
- privateActivitymActivity;
- privatestaticintbrightnessNum=2;
- publicSystemManager(){
- mActivity=MainActivity.mActivity;
- audioManager=(AudioManager)mActivity.getSystemService(Context.AUDIO_SERVICE);
- getScreenBrightness(mActivity);
- brightnessNum=(int)((getScreenBrightness(mActivity)*1.0/255)*5);
- Log.v("","--->getScreenBrightness(mActivity):"+getScreenBrightness(mActivity));
- Log.v("","--->brightnessNum:"+brightnessNum);
- }
- /**
- *媒体音量增减
- */
- publicvoidCtrlVolume(StringctrlCode){
- if(ctrlCode.contains("-")){
- //第一个参数:声音类型
- //第二个参数:调整音量的方向
- //第三个参数:可选的标志位
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_LOWER,
- AudioManager.FLAG_SHOW_UI);
- }else{
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_RAISE,
- AudioManager.FLAG_SHOW_UI);//调高声音
- }
- }
- /**
- *系统亮度增减
- */
- publicvoidCtrlBrightness(StringctrlCode){
- if(brightnessNum<0||brightnessNum>5)brightnessNum=2;
- if(ctrlCode.contains("-")){
- if(brightnessNum>0)brightnessNum--;
- }else{
- if(brightnessNum<5)brightnessNum++;
- }
- Messagemsg=newMessage();
- msg.what=SocketService.SET_BRIGHTNESS;
- msg.obj=(brightnessNum)*1.0f/5;
- SocketService.mHandler.sendMessage(msg);
- }
- /**
- *获取屏幕的亮度
- *
- *@paramactivity
- *@return
- */
- publicstaticintgetScreenBrightness(Activityactivity){
- intnowBrightnessValue=0;
- ContentResolverresolver=activity.getContentResolver();
- try{
- nowBrightnessValue=android.provider.Settings.System.getInt(
- resolver,Settings.System.SCREEN_BRIGHTNESS);
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnnowBrightnessValue;
- }
- /**
- *设置系统亮度
- *@parambrightness:0~1
- */
- publicstaticvoidsetBrightness(Activityactivity,floatbrightness)
- {
- WindowManager.LayoutParamslp=activity.getWindow().getAttributes();
- lp.screenBrightness=brightness;//这里设置范围0~1.0
- activity.getWindow().setAttributes(lp);
- Settings.System.putInt(activity.getContentResolver(),
- android.provider.Settings.System.SCREEN_BRIGHTNESS,
- (int)(brightness*255));
- }
- /**
- *保存亮度设置状态
- *
- *@paramresolver
- *@parambrightness:0~1
- */
- publicstaticvoidsaveBrightness(ContentResolverresolver,floatbrightness){
- Uriuri=android.provider.Settings.System
- .getUriFor("screen_brightness");
- android.provider.Settings.System.putInt(resolver,"screen_brightness",
- (int)(brightness*255));
- resolver.notifyChange(uri,null);
- }
- }
f.WifiAdmin.java 与wifi相关类,可查询本机Wifi连接状态、IP地址、IP地址的int形式与IP显示形式转换 [java] view plain copy
- /**
- *与wifi相关
- */
- publicclassWifiAdmin
- {
- //定义WifiManager对象
- privateWifiManagermWifiManager;
- //定义WifiInfo对象
- privateWifiInfomWifiInfo;
- //扫描出的网络连接列表
- privateList<ScanResult>mWifiList;
- //网络连接列表
- privateList<WifiConfiguration>mWifiConfiguration;
- //定义一个WifiLock
- WifiLockmWifiLock;
- //构造器
- publicWifiAdmin(Contextcontext)
- {
- //取得WifiManager对象
- mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
- //取得WifiInfo对象
- mWifiInfo=mWifiManager.getConnectionInfo();
- }
- //打开WIFI
- publicvoidOpenWifi()
- {
- if(!mWifiManager.isWifiEnabled())
- {
- mWifiManager.setWifiEnabled(true);
- }
- }
- //关闭WIFI
- publicvoidCloseWifi()
- {
- if(!mWifiManager.isWifiEnabled())
- {
- mWifiManager.setWifiEnabled(false);
- }
- }
- //锁定WifiLock
- publicvoidAcquireWifiLock()
- {
- mWifiLock.acquire();
- }
- //解锁WifiLock
- publicvoidReleaseWifiLock()
- {
- //判断时候锁定
- if(mWifiLock.isHeld())
- {
- mWifiLock.acquire();
- }
- }
- //创建一个WifiLock
- publicvoidCreatWifiLock()
- {
- mWifiLock=mWifiManager.createWifiLock("Test");
- }
- //得到配置好的网络
- publicList<WifiConfiguration>GetConfiguration()
- {
- returnmWifiConfiguration;
- }
- //指定配置好的网络进行连接
- publicvoidConnectConfiguration(intindex)
- {
- //索引大于配置好的网络索引返回
- if(index>mWifiConfiguration.size())
- {
- return;
- }
- //连接配置好的指定ID的网络
- mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);
- }
- publicvoidStartScan()
- {
- mWifiManager.startScan();
- //得到扫描结果
- mWifiList=mWifiManager.getScanResults();
- //得到配置好的网络连接
- mWifiConfiguration=mWifiManager.getConfiguredNetworks();
- }
- //得到网络列表
- publicList<ScanResult>GetWifiList()
- {
- returnmWifiList;
- }
- //查看扫描结果
- publicStringBuilderLookUpScan()
- {
- StringBuilderstringBuilder=newStringBuilder();
- for(inti=0;i<mWifiList.size();i++)
- {
- stringBuilder.append("Index_"+newInteger(i+1).toString()+":");
- //将ScanResult信息转换成一个字符串包
- //其中把包括:BSSID、SSID、capabilities、frequency、level
- stringBuilder.append((mWifiList.get(i)).toString());
- stringBuilder.append("/n");
- }
- returnstringBuilder;
- }
- //得到MAC地址
- publicStringGetMacAddress()
- {
- return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
- }
- //得到接入点的BSSID
- publicStringGetBSSID()
- {
- return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
- }
- //得到IP地址
- publicintGetIPAddress()
- {
- return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();
- }
- //得到连接的ID
- publicintGetNetworkId()
- {
- return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();
- }
- //得到WifiInfo的所有信息包
- publicStringGetWifiInfo()
- {
- return(mWifiInfo==null)?"NULL":mWifiInfo.toString();
- }
- //添加一个网络并连接
- publicvoidAddNetwork(WifiConfigurationwcg)
- {
- intwcgID=mWifiManager.addNetwork(wcg);
- mWifiManager.enableNetwork(wcgID,true);
- }
- //断开指定ID的网络
- publicvoidDisconnectWifi(intnetId)
- {
- mWifiManager.disableNetwork(netId);
- mWifiManager.disconnect();
- }
- //将127.0.0.1形式的IP地址转换成十进制整数,这里没有进行任何错误处理
- publicstaticlongipToLong(StringstrIp){
- long[]ip=newlong[4];
- //先找到IP地址字符串中.的位置
- intposition1=strIp.indexOf(".");
- intposition2=strIp.indexOf(".",position1+1);
- intposition3=strIp.indexOf(".",position2+1);
- //将每个.之间的字符串转换成整型
- ip[0]=Long.parseLong(strIp.substring(0,position1));
- ip[1]=Long.parseLong(strIp.substring(position1+1,position2));
- ip[2]=Long.parseLong(strIp.substring(position2+1,position3));
- ip[3]=Long.parseLong(strIp.substring(position3+1));
- return(ip[3]<<24)+(ip[2]<<16)+(ip[1]<<8)+ip[0];
- }
- //将十进制整数形式转换成127.0.0.1形式的ip地址
- publicstaticStringlongToIP(longlongIp){
- StringBuffersb=newStringBuffer("");
- //将高24位置0
- sb.append(String.valueOf((longIp&0x000000FF)));
- sb.append(".");
- //将高16位置0,然后右移8位
- sb.append(String.valueOf((longIp&0x0000FFFF)>>>8));
- sb.append(".");
- //将高8位置0,然后右移16位
- sb.append(String.valueOf((longIp&0x00FFFFFF)>>>16));
- sb.append(".");
- //直接右移24位
- sb.append(String.valueOf((longIp>>>24)));
- returnsb.toString();
- }
- }
g.Manifest.xml(配置文件)需要添加权限 [html] view plain copy
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>
- <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
- <uses-permissionandroid:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
- <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>
- <uses-permissionandroid:name="android.permission.GET_TASKS"/>
四、后记&下篇内容 本例中设置系统亮度未能很好的实现,每次设置亮度都会进行判断当前系统显示的Activty,而设置亮度目前需要到服务端界面设置才成功,所以退出服务端界面后,设置系统亮度会进行判断,如果当前不是显示服务端MainActivity,则在服务中重新打开。 下篇主要内容是模拟系统按键消息,单击事件,滚动事件等。 参考引用: 1.《李刚疯狂Android讲义》十三章 2.Android APIs: http://developer.android.com/reference/java/net/ServerSocket.html
更多相关文章
- Android后端服务器的搭建方法
- 手机淘宝Android客户端架构
- 南青信息查询 for Android客户端
- Android客户端与服务器端交互,如何保持session回话
- Android实现录屏直播(三)MediaProjection + VirtualDisplay + libr
- 微服务-Android客户端: 实现注册和登录