微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 11 中的传感器注册问题

如何解决Android 11 中的传感器注册问题

我正在创建一个应用程序,用户必须在其中重写出现在屏幕顶部的句子。在他写的时候,我需要在 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 举报,一经查实,本站将立刻删除。