|
|
|
@ -1,42 +1,32 @@
|
|
|
|
|
package wificar;
|
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.content.Intent;
|
|
|
|
|
import android.graphics.Bitmap;
|
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
|
import android.hardware.display.DisplayManager;
|
|
|
|
|
import android.hardware.display.VirtualDisplay;
|
|
|
|
|
import android.media.MediaScannerConnection;
|
|
|
|
|
import android.media.projection.MediaProjection;
|
|
|
|
|
import android.media.projection.MediaProjectionManager;
|
|
|
|
|
import android.net.Uri;
|
|
|
|
|
import android.os.AsyncTask;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.os.Environment;
|
|
|
|
|
import android.os.Message;
|
|
|
|
|
import android.os.StrictMode;
|
|
|
|
|
import android.util.DisplayMetrics;
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
import android.view.KeyEvent;
|
|
|
|
|
import android.view.Surface;
|
|
|
|
|
import android.view.View;
|
|
|
|
|
import android.view.Window;
|
|
|
|
|
import android.view.WindowManager;
|
|
|
|
|
import android.widget.ImageButton;
|
|
|
|
|
import android.widget.Button;
|
|
|
|
|
import android.widget.CheckBox;
|
|
|
|
|
import android.widget.LinearLayout;
|
|
|
|
|
import android.widget.RelativeLayout;
|
|
|
|
|
import android.widget.SeekBar;
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
import java.net.InetAddress;
|
|
|
|
|
import java.net.Socket;
|
|
|
|
|
import java.net.URL;
|
|
|
|
|
import java.net.UnknownHostException;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Timer;
|
|
|
|
|
import java.util.TimerTask;
|
|
|
|
|
|
|
|
|
|
import my.wificar.R;
|
|
|
|
|
|
|
|
|
@ -44,52 +34,160 @@ public class MyVideo extends Activity {
|
|
|
|
|
public static String CameraIp;
|
|
|
|
|
public static String CtrlIp;
|
|
|
|
|
public static String CtrlPort;
|
|
|
|
|
URL videoUrl;
|
|
|
|
|
MySurfaceView r;
|
|
|
|
|
OutputStream socketWriter;
|
|
|
|
|
InputStream socketReader;
|
|
|
|
|
SocketListener socketListener2001;
|
|
|
|
|
SoundSocketListener socketListener2002;
|
|
|
|
|
SeekBar xSeekbar,ySeekbar;
|
|
|
|
|
SeekBar xSeekbar;
|
|
|
|
|
Button menuIcon;
|
|
|
|
|
TextView distanceText,lifeCheckText,poseCheckText,suggestionText,avoidText;
|
|
|
|
|
CheckBox distanceBtn,lifeCheckBtn,poseCheckBtn,suggestionBtn,avoidBtn;
|
|
|
|
|
private Socket socket;
|
|
|
|
|
private Socket soundSocket;
|
|
|
|
|
private RockerView rockerView;
|
|
|
|
|
LinearLayout menu;
|
|
|
|
|
private long exitTime = 0;
|
|
|
|
|
|
|
|
|
|
Timer timer = new Timer();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean btnEnabled = false;
|
|
|
|
|
|
|
|
|
|
private List<View> menuContent = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
private void showMenuContent() {
|
|
|
|
|
for (View view : menuContent) {
|
|
|
|
|
view.setVisibility(View.VISIBLE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
private void hideMenuContent() {
|
|
|
|
|
for (View view : menuContent) {
|
|
|
|
|
view.setVisibility(View.GONE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void onCreate(Bundle savedInstanceState) {
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
|
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐去标题(应用的名字必须要写在setContentView之前,否则会有异常)
|
|
|
|
|
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
|
|
|
|
|
|
|
|
LinearLayout linearLayout = findViewById(R.id.linearLayout4);
|
|
|
|
|
xSeekbar = linearLayout.findViewById(R.id.xSeekbar);
|
|
|
|
|
ySeekbar = linearLayout.findViewById(R.id.ySeekbar);
|
|
|
|
|
|
|
|
|
|
xSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
|
|
|
setContentView(R.layout.myvideo);
|
|
|
|
|
timer.schedule(new TimerTask() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
|
|
|
|
|
public void run() {
|
|
|
|
|
while (true) {
|
|
|
|
|
try {
|
|
|
|
|
Thread.sleep(6000);
|
|
|
|
|
runOnUiThread(()->{
|
|
|
|
|
TextView textView = findViewById(R.id.suggestion);
|
|
|
|
|
textView.setText(Configuration.getInstance().getRandomSuggestion());
|
|
|
|
|
});
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 1000L, 1000L);
|
|
|
|
|
distanceText = findViewById(R.id.distanceText);
|
|
|
|
|
distanceBtn = findViewById(R.id.distanceBtn);
|
|
|
|
|
distanceBtn.setChecked(true);
|
|
|
|
|
distanceBtn.setOnClickListener(view -> {
|
|
|
|
|
CheckBox checkBox = (CheckBox) view;
|
|
|
|
|
LinearLayout layout = findViewById(R.id.distanceLayout);
|
|
|
|
|
if(checkBox.isChecked()) {
|
|
|
|
|
layout.setVisibility(View.VISIBLE);
|
|
|
|
|
} else layout.setVisibility(View.GONE);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
lifeCheckText = findViewById(R.id.lifeCheckText);
|
|
|
|
|
lifeCheckBtn = findViewById(R.id.lifeCheckBtn);
|
|
|
|
|
lifeCheckBtn.setChecked(true);
|
|
|
|
|
lifeCheckBtn.setOnClickListener(view -> {
|
|
|
|
|
CheckBox checkBox = (CheckBox) view;
|
|
|
|
|
LinearLayout layout = findViewById(R.id.lifeCheckLayout);
|
|
|
|
|
if(checkBox.isChecked()) {
|
|
|
|
|
layout.setVisibility(View.VISIBLE);
|
|
|
|
|
} else layout.setVisibility(View.GONE);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
poseCheckText = findViewById(R.id.poseCheckText);
|
|
|
|
|
poseCheckBtn = findViewById(R.id.poseCheckBtn);
|
|
|
|
|
poseCheckBtn.setChecked(true);
|
|
|
|
|
poseCheckBtn.setOnClickListener(view -> {
|
|
|
|
|
CheckBox checkBox = (CheckBox) view;
|
|
|
|
|
LinearLayout layout = findViewById(R.id.poseCheckLayout);
|
|
|
|
|
if(checkBox.isChecked()) {
|
|
|
|
|
layout.setVisibility(View.VISIBLE);
|
|
|
|
|
} else layout.setVisibility(View.GONE);
|
|
|
|
|
Configuration.getInstance().poseCheck = checkBox.isChecked();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
suggestionText = findViewById(R.id.suggestionText);
|
|
|
|
|
suggestionBtn = findViewById(R.id.suggestionBtn);
|
|
|
|
|
suggestionBtn.setChecked(false);
|
|
|
|
|
suggestionBtn.setOnClickListener(view -> {
|
|
|
|
|
CheckBox checkBox = (CheckBox) view;
|
|
|
|
|
TextView textView = findViewById(R.id.suggestion);
|
|
|
|
|
if(checkBox.isChecked()) {
|
|
|
|
|
textView.setVisibility(View.VISIBLE);
|
|
|
|
|
} else textView.setVisibility(View.GONE);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
avoidBtn = findViewById(R.id.avoidBtn);
|
|
|
|
|
avoidText = findViewById(R.id.avoidText);
|
|
|
|
|
avoidBtn.setOnClickListener(view -> {
|
|
|
|
|
CheckBox checkBox = (CheckBox) view;
|
|
|
|
|
if(checkBox.isChecked()) {
|
|
|
|
|
try {
|
|
|
|
|
socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x07, (byte)((int)(progress * 1.8)), (byte) 0xff});
|
|
|
|
|
socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x13, (byte) 0x04, (byte)0x00, (byte) 0xff});
|
|
|
|
|
socketWriter.flush();
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
runOnUiThread(()-> Toast.makeText(this,"网络异常!",Toast.LENGTH_SHORT).show());
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
try {
|
|
|
|
|
socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x13, (byte) 0x00, (byte)0x00, (byte) 0xff});
|
|
|
|
|
socketWriter.flush();
|
|
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
runOnUiThread(()-> Toast.makeText(this,"网络异常!",Toast.LENGTH_SHORT).show());
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
menuContent.add(distanceText);
|
|
|
|
|
menuContent.add(lifeCheckText);
|
|
|
|
|
menuContent.add(poseCheckText);
|
|
|
|
|
menuContent.add(suggestionText);
|
|
|
|
|
menuContent.add(distanceBtn);
|
|
|
|
|
menuContent.add(lifeCheckBtn);
|
|
|
|
|
menuContent.add(poseCheckBtn);
|
|
|
|
|
menuContent.add(suggestionBtn);
|
|
|
|
|
menuContent.add(avoidBtn);
|
|
|
|
|
menuContent.add(avoidText);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
|
|
|
hideMenuContent();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
menu = findViewById(R.id.droppedMenu);
|
|
|
|
|
xSeekbar = findViewById(R.id.xSeekbar);
|
|
|
|
|
|
|
|
|
|
menuIcon = findViewById(R.id.menuIcon);
|
|
|
|
|
menuIcon.setOnClickListener(view -> {
|
|
|
|
|
btnEnabled = !btnEnabled;
|
|
|
|
|
if(btnEnabled) {
|
|
|
|
|
showMenuContent();
|
|
|
|
|
} else hideMenuContent();
|
|
|
|
|
});
|
|
|
|
|
ySeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
|
|
|
|
|
|
|
|
xSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
|
|
|
|
|
try {
|
|
|
|
|
socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x08, (byte)((int)(progress * 1.8)), (byte) 0xff});
|
|
|
|
|
if(socketWriter == null) return;
|
|
|
|
|
socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x08, (byte)((int)(progress * 0.9)+45), (byte) 0xff});
|
|
|
|
|
socketWriter.flush();
|
|
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
@ -106,10 +204,6 @@ public class MyVideo extends Activity {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐去标题(应用的名字必须要写在setContentView之前,否则会有异常)
|
|
|
|
|
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
|
|
|
setContentView(R.layout.myvideo);
|
|
|
|
|
if (android.os.Build.VERSION.SDK_INT > 9) {
|
|
|
|
|
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
|
|
|
|
|
StrictMode.setThreadPolicy(policy);
|
|
|
|
@ -129,28 +223,28 @@ public class MyVideo extends Activity {
|
|
|
|
|
public void InitSocket(Activity activity) {
|
|
|
|
|
|
|
|
|
|
// TODO ²âÊÔ
|
|
|
|
|
// try {
|
|
|
|
|
// socket = new Socket(InetAddress.getByName(CtrlIp), Integer.parseInt(CtrlPort));
|
|
|
|
|
// soundSocket = new Socket(InetAddress.getByName(CtrlIp), 2002);
|
|
|
|
|
// } catch (UnknownHostException e) {
|
|
|
|
|
// // TODO Auto-generated catch block
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// // TODO Auto-generated catch block
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
// try {
|
|
|
|
|
// socketWriter = socket.getOutputStream();
|
|
|
|
|
// socketReader = socket.getInputStream();
|
|
|
|
|
// socketListener2001 = new SocketListener(activity,socketReader);
|
|
|
|
|
// socketListener2002 = new SoundSocketListener(activity,soundSocket.getInputStream());
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// // TODO Auto-generated catch block
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
try {
|
|
|
|
|
socket = new Socket(InetAddress.getByName(CtrlIp), Integer.parseInt(CtrlPort));
|
|
|
|
|
soundSocket = new Socket(InetAddress.getByName(CtrlIp), 2002);
|
|
|
|
|
} catch (UnknownHostException e) {
|
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
socketWriter = socket.getOutputStream();
|
|
|
|
|
socketReader = socket.getInputStream();
|
|
|
|
|
socketListener2001 = new SocketListener(activity,socketReader);
|
|
|
|
|
socketListener2002 = new SoundSocketListener(activity,soundSocket.getInputStream());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
LinearLayout rockerLayout = findViewById(R.id.rocketLayout);
|
|
|
|
|
rockerView = new RockerView(this,socketWriter,this.getApplicationContext(),null);
|
|
|
|
|
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(1000,1000);
|
|
|
|
|
addContentView(rockerView,params);
|
|
|
|
|
rockerLayout.addView(rockerView);
|
|
|
|
|
//Toast.makeText(this,"³õʼ»¯ÍøÂçʧ°Ü£¡"+e.getMessage(),Toast.LENGTH_LONG).show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|