Java 当主加速计事件值时应用程序崩溃
我开发了一个PC远程应用程序,能够使用android加速度传感器移动光标鼠标。我使用java.io.PrintWriter从onSensorChanged读取加速计事件值并发送到服务器,但应用程序崩溃。请帮忙。Java 当主加速计事件值时应用程序崩溃,java,android,client-server,accelerometer,printwriter,Java,Android,Client Server,Accelerometer,Printwriter,我开发了一个PC远程应用程序,能够使用android加速度传感器移动光标鼠标。我使用java.io.PrintWriter从onSensorChanged读取加速计事件值并发送到服务器,但应用程序崩溃。请帮忙。 语境; 切换按钮切换按钮2; 私有切换按钮切换按钮1; 按钮下一个按钮; 按钮前一个按钮; 文本视图鼠标垫; 文本视图返回文本; TextView textViewX; TextView textViewY; 私人传感器管理器; 专用传感器mAccelerometer; 私有布尔值is
语境;
切换按钮切换按钮2;
私有切换按钮切换按钮1;
按钮下一个按钮;
按钮前一个按钮;
文本视图鼠标垫;
文本视图返回文本;
TextView textViewX;
TextView textViewY;
私人传感器管理器;
专用传感器mAccelerometer;
私有布尔值isConnected=false;
私有布尔mouseMoved=false;
专用插座;
私人打印输出;
私有浮点initX=0;
私有浮点数=0;
私有浮点disX=0;
私有浮点disY=0;
专用语音识别器语音=null;
私人意图识别人意图;
私有字符串LOG_TAG=“VoiceRecognitionActivity”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msSensorManager=(SensorManager)getSystemService(Context.SENSOR\u服务);
mAccelerometer=msSensorManager.getDefaultSensor(传感器类型\加速计);
上下文=这个;
returnedText=(TextView)findViewById(R.id.returnedText);
toggleButton1=(ToggleButton)findViewById(R.id.toggleButton1);
toggleButton2=(ToggleButton)findViewById(R.id.toggleButton2);
nextButton=(按钮)findViewById(R.id.nextButton);
previousButton=(按钮)findViewById(R.id.previousButton);
textViewX=(TextView)findViewById(R.id.textViewX);
textViewY=(TextView)findViewById(R.id.textViewY);
setOnClickListener(这个);
previousButton.setOnClickListener(此);
mousePad=(TextView)findViewById(R.id.mousePad);
mousePad.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
如果(断开连接并退出!=null){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
//当用户触摸文本视图时保存X和Y位置
initX=event.getX();
initY=event.getY();
mouseMoved=false;
打破
case MotionEvent.ACTION\u移动:
disX=event.getX()-initX;//鼠标在x方向的移动
disY=event.getY()-initY;//鼠标在y方向的移动
/*将init设置为新位置,以便连续移动鼠标
被俘*/
initX=event.getX();
initY=event.getY();
if(disX!=0 | | disY!=0){
out.println(disX+,“+disY);//将鼠标移动发送到服务器
}
mouseMoved=true;
打破
case MotionEvent.ACTION\u UP:
//仅当usr在下一操作后未移动鼠标时,才考虑轻触
如果(!mouseMoved){
out.println(常量。鼠标左键单击);
}
}
}
返回true;
}
});
SpeechRecognizer.createSpeechRecognizer(此);
speech.setRecognitionListener(此);
recognizerIntent=新意图(recognizerIntent.ACTION\u recognizer\u SPEECH);
recognizerIntent.putExtra(recognizerIntent.EXTRA_语言_首选项,
“en”);
recognizerIntent.putExtra(recognizerIntent.EXTRA_调用_包,
这个.getPackageName());
recognizerIntent.putExtra(recognizerIntent.EXTRA_语言_模型,
识别者意图、语言、模型、网络搜索);
recognizerIntent.putExtra(recognizerIntent.EXTRA_最大_结果,1);
toggleButton1.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
演讲。听讲(识别意图);
}否则{
停止听;
}
}
});
msSensorManager.registerListener(此、mAccelerometer、SensorManager.SENSOR\u延迟\u正常);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
Intent i=新Intent(getApplicationContext(),SetIP.class);
星触觉(i);
完成();
}
//noinspection SimplifiableIf语句
if(id==R.id.action\u connect){
Intent=getIntent();
字符串ipadd=intent.getStringExtra(“ipaddress”);
ConnectPhoneTask ConnectPhoneTask=新的ConnectPhoneTask();
connectPhoneTask.execute(ipadd);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.playPauseButton:
{
out.println(常量。鼠标右键单击);
}
打破
案例R.id.nextButton:
如果(断开连接并退出!=null){
out.println(Constants.NEXT);
}
打破
案例R.id.Previous按钮:
如果(断开连接并退出!=null){
out.println(常量前一个);
}
打破
}
}
@凌驾
公共空间
{
super.ondestory();
如果(断开连接并退出!=null){
试一试{
out.println(“退出”);
socket.close();
}捕获(IOE异常){
Log.e(“remotedroid”,“关闭套接字时出错”,e);
}
}
}
@凌驾
恢复时公开作废(){
super.onResume();
Context context;
ToggleButton toggleButton2;
private ToggleButton toggleButton1;
Button nextButton;
Button previousButton;
TextView mousePad;
TextView returnedText;
TextView textViewX;
TextView textViewY;
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private boolean isConnected=false;
private boolean mouseMoved=false;
private Socket socket;
private PrintWriter out;
private float initX =0;
private float initY =0;
private float disX =0;
private float disY =0;
private SpeechRecognizer speech = null;
private Intent recognizerIntent;
private String LOG_TAG = "VoiceRecognitionActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
context = this;
returnedText = (TextView) findViewById(R.id.returnedText);
toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
toggleButton2 = (ToggleButton) findViewById(R.id.toggleButton2);
nextButton = (Button)findViewById(R.id.nextButton);
previousButton = (Button)findViewById(R.id.previousButton);
textViewX = (TextView) findViewById(R.id.textViewX);
textViewY = (TextView) findViewById(R.id.textViewy);
nextButton.setOnClickListener(this);
previousButton.setOnClickListener(this);
mousePad = (TextView)findViewById(R.id.mousePad);
mousePad.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(isConnected && out!=null){
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//save X and Y positions when user touches the TextView
initX =event.getX();
initY =event.getY();
mouseMoved=false;
break;
case MotionEvent.ACTION_MOVE:
disX = event.getX()- initX; //Mouse movement in x direction
disY = event.getY()- initY; //Mouse movement in y direction
/*set init to new position so that continuous mouse movement
is captured*/
initX = event.getX();
initY = event.getY();
if(disX !=0|| disY !=0){
out.println(disX +","+ disY); //send mouse movement to server
}
mouseMoved=true;
break;
case MotionEvent.ACTION_UP:
//consider a tap only if usr did not move mouse after ACTION_DOWN
if(!mouseMoved){
out.println(Constants.MOUSE_LEFT_CLICK);
}
}
}
return true;
}
});
speech = SpeechRecognizer.createSpeechRecognizer(this);
speech.setRecognitionListener(this);
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
"en");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
this.getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
toggleButton1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
speech.startListening(recognizerIntent);
} else {
speech.stopListening();
}
}
});
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_settings) {
Intent i = new Intent(getApplicationContext(), SetIP.class);
startActivity(i);
finish();
}
//noinspection SimplifiableIfStatement
if(id == R.id.action_connect) {
Intent intent = getIntent();
String ipadd = intent.getStringExtra("ipaddress");
ConnectPhoneTask connectPhoneTask = new ConnectPhoneTask();
connectPhoneTask.execute(ipadd);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.playPauseButton:
{
out.println(Constants.MOUSE_RIGHT_CLICK);
}
break;
case R.id.nextButton:
if (isConnected && out!=null) {
out.println(Constants.NEXT);
}
break;
case R.id.previousButton:
if (isConnected && out!=null) {
out.println(Constants.PREVIOUS);
}
break;
}
}
@Override
public void onDestroy()
{
super.onDestroy();
if(isConnected && out!=null) {
try {
out.println("exit");
socket.close();
} catch (IOException e) {
Log.e("remotedroid", "Error in closing socket", e);
}
}
}
@Override
public void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
if (speech != null) {
speech.destroy();
Log.i(LOG_TAG, "destroy");
}
mSensorManager.unregisterListener(this);
}
public void onStop() {
super.onStop();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// can be safely ignored for this demo
}
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
textViewX.setText(Float.toString(x));
textViewY.setText(Float.toString(y));
Log.i(LOG_TAG, x+","+y);
if ((x = null) && (y = null))
try{
out.println(String.valueOf(x)+","+String.valueOf(y));
}catch (IOException e) {
Log.e("remotedroid", "huhuhu", e);}}
@Override
public void onBeginningOfSpeech() {
Log.i(LOG_TAG, "onBeginningOfSpeech");
}
@Override
public void onBufferReceived(byte[] buffer) {
Log.i(LOG_TAG, "onBufferReceived: " + buffer);
}
@Override
public void onEndOfSpeech() {
Log.i(LOG_TAG, "onEndOfSpeech");
toggleButton1.setChecked(false);
}
@Override
public void onError(int errorCode) {
String errorMessage = getErrorText(errorCode);
Log.d(LOG_TAG, "FAILED " + errorMessage);
toggleButton1.setChecked(false);
}
@Override
public void onEvent(int arg0, Bundle arg1) {
Log.i(LOG_TAG, "onEvent");
}
@Override
public void onPartialResults(Bundle arg0) {
Log.i(LOG_TAG, "onPartialResults");
}
@Override
public void onReadyForSpeech(Bundle arg0) {
Log.i(LOG_TAG, "onReadyForSpeech");
}
@Override
public void onResults(Bundle results) {
Log.i(LOG_TAG, "onResults");
ArrayList<String> matches = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
String text = "";
for (String result : matches) {
text = result;
}
out.println(text);
returnedText.setText(text);
}
@Override
public void onRmsChanged(float rmsdB) {
Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
}
public static String getErrorText(int errorCode) {
String message;
switch (errorCode) {
case SpeechRecognizer.ERROR_AUDIO:
message = "Audio recording error";
break;
case SpeechRecognizer.ERROR_CLIENT:
message = "Client side error";
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
message = "Insufficient permissions";
break;
case SpeechRecognizer.ERROR_NETWORK:
message = "Network error";
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
message = "Network timeout";
break;
case SpeechRecognizer.ERROR_NO_MATCH:
message = "No match";
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
message = "RecognitionService busy";
break;
case SpeechRecognizer.ERROR_SERVER:
message = "error from server";
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
message = "No speech input";
break;
default:
message = "Didn't understand, please try again.";
break;
}
return message;
}
public class ConnectPhoneTask extends AsyncTask<String,Void,Boolean> {
@Override
protected Boolean doInBackground(String... params) {
boolean result = true;
try {
InetAddress serverAddr = InetAddress.getByName(params[0]);
socket = new Socket(serverAddr, Constants.SERVER_PORT);//Open socket on server IP and port
} catch (IOException e) {
Log.e("remotedroid", "Error while connecting", e);
result = false;
}
return result;
}
@Override
protected void onPostExecute(Boolean result)
{
isConnected = result;
Toast.makeText(context,isConnected?"Connected to server!":"Error while connecting",Toast.LENGTH_LONG).show();
try {
if(isConnected) {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
}
}catch (IOException e){
Log.e("remotedroid", "Error while creating OutWriter", e);
Toast.makeText(context,"Error while connecting",Toast.LENGTH_LONG).show();
}
}
}
if(isConnected && out!=null) {
// Your code to use out
// out.println(.......);
}
//This is where the variable is initiated already in your code
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
textViewX.setText(Float.toString(x));
textViewY.setText(Float.toString(y));
Log.i(LOG_TAG, x+","+y);
if(isConnected && out!=null)
out.println(String.valueOf(x) + "," + String.valueOf(y));
}