Java 当主加速计事件值时应用程序崩溃

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

我开发了一个PC远程应用程序,能够使用android加速度传感器移动光标鼠标。我使用java.io.PrintWriter从onSensorChanged读取加速计事件值并发送到服务器,但应用程序崩溃。请帮忙。

语境;
切换按钮切换按钮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));
}