问题描述
我正在创建一个应用程序,用户必须在其中重写出现在屏幕顶部的句子。在他写的时候,我需要在 csv 文件中保存一些值,每一行的组成如下:generateCSVRow(SensorVal,TouchedView,pressure,time);
其中 SensorVal 包含一些传感器值,TouchedView 是用户在键盘上触摸的字符(我在里面创建了一个键盘app,它不是手机的键盘,TouchedView 是-1(如果我不触摸键盘的按键),压力是 event.getPressure()(MotionEvent 的事件),时间是 System.currentTimeMillis()。行示例:
最后一列包含压力,倒数第二列是 TouchedView(其他列包含传感器值和时间)。
我需要该 csv 文件包含用户正在编写的句子的所有字符(我保存在 TouchedView 中)。为此,当用户写句子时,我保存行,我将把这些行放在文件中,在一个 arrayList(称为rowsToLoad)中,当我按下一个单词和下一个 I 之间的空格键(键盘的空格键)时检查 arrayList 是否包含刚刚写入的单词的所有字母,如果包含它们,我将 arraylist 的内容写入文件(使用 PrintWriter),否则用户将不得不重新输入刚刚写入的单词。这是我的代码:
onSensorResume
private void onSensoResume() {
mLastAccSet = false;
mLastMagSet = false;
// if (mAcc != null){mSensorManager.registerListener(this,mAcc,SensorManager.SENSOR_DELAY_norMAL);}
// if (mGyr != null){mSensorManager.registerListener(this,mGyr,SensorManager.SENSOR_DELAY_norMAL);}
// if (mMag != null){mSensorManager.registerListener(this,mMag,SensorManager.SENSOR_DELAY_norMAL);}
// if (mGrav != null){mSensorManager.registerListener(this,mGrav,SensorManager.SENSOR_DELAY_norMAL);}
if (mAcc != null){mSensorManager.registerListener(this,SensorManager.SENSOR_DELAY_FASTEST);}
if (mGyr != null){mSensorManager.registerListener(this,SensorManager.SENSOR_DELAY_FASTEST);}
if (mMag != null){mSensorManager.registerListener(this,SensorManager.SENSOR_DELAY_FASTEST);}
if (mGrav != null){mSensorManager.registerListener(this,SensorManager.SENSOR_DELAY_FASTEST);}
}
onSensorChanged
public void onSensorChanged(SensorEvent event) {
long time = System.currentTimeMillis();
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
System.arraycopy(event.values,SensorVal,event.values.length);
System.arraycopy(event.values,mLastAcc,event.values.length);
mLastAccSet = true;
}
if (event.sensor.getType() == Sensor.TYPE_gyroscope) {
System.arraycopy(event.values,3,event.values.length);
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
System.arraycopy(event.values,6,mLastMag,event.values.length);
mLastMagSet = true;
}
if (event.sensor.getType() == Sensor.TYPE_GraviTY) {
System.arraycopy(event.values,12,event.values.length);
}
if (mLastAccSet && mLastMagSet){
SensorManager.getRotationMatrix(mR,null,mLastMag);
SensorManager.getorientation(mR,mOrientation);
System.arraycopy(mOrientation,9,event.values.length);
}
//generateCSVRow only append parameters and return StringBuilder
StringBuilder csvRow = CSV.generateCSVRow(SensorVal,time);
//add row to rowsToLoad (that is ArrayList<StringBuilder>)
rowsToLoad.add(csvRow);
}
检查 arrayList rowsToLoad 是否包含刚写的单词的所有字符
private boolean checkAllCharacter(boolean isLastWord){
String word = arrOfStr[0] + " "; //the word just written
if (isLastWord){
word = arrOfStr[1];
}
char[] strArray = word.tochararray();
for (StringBuilder stringBuilder: rowsToLoad){
if (strArray.length != 0) {
String[] data = stringBuilder.toString().split(",");
//if penultimate column is a character
if (!data[16].equals("-1")) {
char character = data[16].charat(0); //take the character of the row
//if the character is equals,remove this from array
if (character == strArray[0]) {
strArray = Arrays.copyOfRange(strArray,1,strArray.length);
}
}
}else {
break;
}
}
检查用户写入的字符串
private void checkString(View v) {
if (!textToWrite.getText().toString().startsWith(textKeypressed.getText().toString())) {
String text = getResources().getString(R.string.wrongKey);
pauseAll(text);
} else {
String text = getResources().getString(R.string.notUploadKey);
if (textToWrite.getText().toString().equals(textKeypressed.getText().toString())) {
if (checkAllCharacter(true)) {
for (StringBuilder stringBuilder: rowsToLoad){
printWriter.print(stringBuilder);
}
rowsToLoad.clear();
finishDialog("Game Over");
}else {
pauseAll(text);
}
} else if (textKeypressed.getText().toString().endsWith(" ")){
if (checkAllCharacter(false)){
//print rows and clear arrayList
for (StringBuilder stringBuilder: rowsToLoad){
printWriter.print(stringBuilder);
}
rowsToLoad.clear();
}else {
pauseAll(text);
}
}
}
}
当某些字符不在 arrayList rowsToLoad 中时调用此方法
private void pauseAll(String textError){
TextView error = findViewById(R.id.textViewWrongKey);
error.setText(textError);
error.setVisibility(View.VISIBLE);
Button retryButton = findViewById(R.id.retry_button);
retryButton.setVisibility(View.VISIBLE);
textKeypressed.setText(wordDone);
mSensorManager.unregisterListener(this); //stop sensors
rowsToLoad.clear(); //clear arrayList (contains wrong rows)
//disable keyboard
ArrayList<View> allButtons;
allButtons = (findViewById(R.id.keyboard)).getTouchables();
for(View tmp : allButtons){
Button tmpButton = (Button) tmp;
tmpButton.setEnabled(false);
}
retryButton.setonClickListener(v1 -> {
//resume sensors
onSensoResume();
countDownTimer.start();
error.setVisibility(View.INVISIBLE);
retryButton.setVisibility(View.GONE);
//enable keyboard
for(View tmp : allButtons){
Button tmpButton = (Button) tmp;
tmpButton.setEnabled(true);
}
});
}
该应用程序从 Android 7 到 Android 10 运行良好,但在 Android 11 中,该应用程序通常不会注册单词的字母,因此它要求重新输入单词,因为在 arrayList 中有不是所有包含用户刚刚输入的单词字符的行。我试图改变传感器的延迟(从正常到最快)但没有任何改变。我该如何解决这个问题?有什么我可以尝试的吗?
Android 11 与之前版本在传感器方面是否存在一些差异?或者增加onSensorChanged调用的方法?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)